kylinH5框架之项目组件理解

目录

 

组件介绍

组件声明结构

组件接口

script

dependency

template

style

状态注入

接口声明


组件介绍

Component 扩充自 Vue 的组件, 提供了 Vue 组件对等的输入参数能力。在代码书写时提供类 class 的装饰器 Decorator 风格。

import { Component, Watch } from '@ali/kylin-framework';

一个组件可以包含数据、JSX 渲染函数、模板、挂载元素、方法、生命周期等 Vue 的 options 选项的对等配置。

组件声明结构

组件声明包括以下几部分, 分别使用 @Component 和 @Watch 两种不同装饰器进行包装:

  • class 类声明, 使用装饰器 @Component
  • 类成员声明, 不使用装饰器。
  • 类成员方法声明, 一般不装饰器, 除非该方法需要 watch 另外一个已声明的变量。

举例子

<!-- Hello.vue -->
<template><div>hello {{name}}<Child></Child></div>
</template>
<style>/* put style here */
</style>
<component default="Child" src="./child.vue" />
<script>import { Component } from '@ali/kylin-framework';@Componentclass Hello {data = {name: 'world'}}export default Hello;
</script>

组件接口

跟 vue 基本一致,组件定义写在 .vue 文件内,以下是一个简单的例子:

<template><div><AButton @click="onClick">点击</AButton></div>
</template>
<style lang="less" rel="stylesheet/less">/* less */
</style>
<dependency component="{ AButton }" src="@alipay/antui-vue" lazy/>
<script type="text/javascript">import { Component } from '@ali/kylin-framework';@Componentexport default class IndexView {props = {}data = {c:666}get comput() { return this.data.c * 2 }onClick() {}mounted() {}}
</script>

上述例子中,<template><style><script>、<dependency>   4 个顶级标签

其中 <template>、 <style> 与 vue 中定义一致。下文将对这 4 个标签的具体作用分别进行阐述。

script

1.class 结构

定义一个 Component ,使用类 class 的装饰器 Decorator 风格。

其中装饰器有 @Component 和 @Watch 2 种,通过以下方式引入。

import { Component, Watch } from '@ali/kylin-framework';
@Component
export default class Hello {
}

2.方法类型

@Component

组件以 class 形式声明,必须对该 class 进行装饰器修饰。

在 class 内部,不需要被手动处理成员变量babel 插件在构建过程中自动进行处理。

而 成员函数 一般不需要装饰器挂载,除非是使用 @Watch 的场景,其中 @Component 会处理的属性如下表所示。

成员类型名称功能
get/set property*用以转换成 Vue 的 computed 计算属性,可以直接通过 this[varName] 调用
method生命周期生命周期方法,与 Vue 对等。
method*普通成员方法, 用以转换成 Vue 的 methods 方法列表。

分别举例:

getter/setter属性

@Component 
export default class Hello {get computName() {// to sth}
}

上述 getter 声明,等价于如下 vue 配置

HelloOption = {computed: {computName: {get: computName() {// to sth}}}
}

同理,setter 也会被提取,如果同时存在 getter 和 setter 则会被一起提取。

生命周期函数

@Component 
export default class Hello {created() {}mounted() {}
}

上述 created 和 mounted 生命周期函数,会被提取为数组。

TestOption = {created: [function created(){}],mounted: [function mounted(){}],
}

支持的生命周期方法名如下,beforeCreatecreatedbeforeMountmountedbeforeUpdateupdated、 beforeDestroydestroyed

Watch

该装饰器的出现,只是因为 watch 需要有以下几个要素:

  • 被监听的变量名
  • 监听选项
  • 触发函数

用法

完整的 @Watch 接口如下表所示。

function Watch( key: string [, option: Object = {} ] ): PropertyDecorator
参数名类型用途
keystring监听的参数名,来自 computeddataprops三者之一。
optiondeepboolean若监听的是复杂对象,其内层数据变更是否触发,默认为 false
immediateboolean立即以表达式的当前值触发回调,默认为 false

示例

  • 对于 @Watch 装饰的成员函数,支持对成员函数配置多个变量的监听,如下同时对 a 和 c 的变化进行了监听,如果任何一个发生变化,会触发 OnChangeA 成员方法。
  • 如下,OnChangeA 本质是成员方法,所以他也会和其他成员方法一起被提取到methods块中,那么必须保证没有与其他方法重名。
  • 如果对Watch有额外配置项,请按 @Watch('a', {deep: false})的方法传入。配置项请参考 watch配置项。
@Component
class WTest {data = {a: {b: 2},c: 3}@Watch('c')@Watch('a', {deep: true}) OnChangeA(newVal, oldVal) {}
}

注意: 以上对 data.a 的监听,会转换成如下形式,需要注意的是,如果没开启 deep: true 选项,当 data.a.b 发生变动的时候,不会触发该 OnChangeA 监听。

3.属性类型

构建工具会自动对成员变量应用了 @Component.Property 装饰器,不需要用户手动填写,

最终的合并策略取决于被装饰的 成员变量 的标识符名称,框架内置了以下几种。如果不在下表中,会透传至 VueComponent 的 options 对象中。

成员类型名称功能
propertypropsvue的props属性
propertydatavue的data属性,会被转换成函数形式, 支持 this,请勿直接写 data(){} 函数
property*其他未知属性,直接复制到 Vue 的 options 中的对应属性上

props

@Component 
export default class Hello {props = {name: {type: String,default: 'haha'},num: Number}
}

上述 props 成员变量定义,会被直接转换成到 options 中对应的 props。具体完整定义结构请参见 Vue 文档 API-props。

HelloOption = {props: {name: {type: String,default: 'haha'},num: Number}
}

data

@Component 
export default class Hello {props = {name: {type: Number,default: 1},}data = {hello: this.props.name + 2}
}

上述 data 成员变量定义,会被转换成 data 函数形式,您无需手动编写 data 函数。

TestOption = {props: {name: {type: Number,default: 1}, },data: function data() {return {hello: this.props.name + 2}}
}

dependency

上述 <script> 定义中,没有说明组件依赖的使用方式,在 .vue 文件中,推荐使用以下写法来标记组件依赖,即 <dependency> 标签,下面示例中即引用了 ./child.vue 组件。

<template><child></child>
</template>
<dependency component="Child" src="./child.vue" />

标签属性

default 导入

针对 ES6 Module 的 default 导出或者 commonjs Module 对象的导出,可使用如下方式引入。

属性类型默认值备注
componentstring必填引入到 options.components 的标识符名。
srcstring必填组件来源,同require(src)。
lazybooleanfalse是否对该组件启用懒加载(当且仅当被 Vue 使用到时再进行 require 加载模块)。
stylestringundefined默认不启用,如果设置了字符串,会根据 ${src}/${style} 的路径来加载组件对应样式文件。

如下示例:

<dependency component="name" src="source" lazy />

 

member 导入

针对 ES6 Module 的命名导出,可使用如下方式引入:

属性类型默认值备注
componentstring必填引入到 options.components 的多个命名标识符, 必须以花括号 {} 包括,否则会识别为 default 引入
srcstring必填组件来源,同 require(src)。
lazybooleanfalse是否对该组组件启用懒加载(当且仅当被 Vue 使用到时再进行 require 加载模块)。

如下示例:

<dependency component="{ List, ListItem, AButton }" src="@alipay/antui-vue" lazy />

默认对 @alipay/antui-vue 组件库支持 babel-plugin-import 按需加载。

template

模板的内容结构与 vue 一致。

<template><div>Hello World</div>
</template>

style

可以通过添加 scoped 属性标记来使得该样式只对当前组件生效。

<style lang="less" rel="stylesheet/less" scoped>/* less */
</style>

状态注入

对于 Kylin 组件, 如果需要使用到 Store 中的属性,使用计算属性把 $store 对象中的属性透传出来是一种不推荐的写法,如下所示:

@Component 
class Hello {// 通过计算属性来关联store中的状态get hello() {return this.$store.state.hello}
}

推荐使用下面的 connect 机制来透传 $store 数据:

  • mapStateToProps
  • mapActionsToMethods
  • mapMethods

接口声明

@Component({mapStateToProps: Object|Array,mapActionsToMethods: Object|Array,mapMethods: Array|Boolean,mapEvents: Array
})
class Hello {
}

mapStateToProps

把 state 中的特定键值映射到当前组件的 props 中,其接收参数等价于 Vuex 提供的 mapState 辅助函数。

有以下 3 种方式可实现上述功能:

函数方式

说明:把 $store.state 中名为 bbb 的数据,映射到名为 aaa 的 props 上。

{mapStateToProps: {aaa: (state, getters) => state.bbb}
}

字符串键值对方式

说明:把 $store.state 中名为 bbb 的数据,映射到名为 aaa 的 props 上。

{mapStateToProps: {aaa: 'bbb'}
}

字符串数组方式

说明

  • 把 $store.state 中名为 aaa 的数据,映射到名为 aaa 的 props 上。
  • 把 $store.state 中的名为 bbb 的数据,映射到名为 bbb 的props 上。
{mapStateToProps: ['aaa', 'bbb']
}

mapActionsToMethods

与 Vuex 中 mapActions 入参一致,支持使用对象方式(名称映射)、数组方式(名称)把在全局 $store 下配置的 actions 注入到当前组件的 methods 中。

@Component({mapActionsToMethods: ['a', 'b']
})
class IndexView {async doSomeAction() {const ret = await this.a(123);// 等价于调用// const ret = await this.$store.dispatch('a', 123);}
}

mapMethods

通过在父子组件之间加一层中间层组件的方式来具体实现 connect 机制。当父组件调用子组件中特定的 method 方法时,无法直接访问子组件(实际访问到的是中间层组件),需要通过以下配置实现访问。

@Component({mapMethods: true
})
export default class Child {a() {}
}
<template><div>this is parent<child ref="child"></child></div>
</template>
<script>@Componentexport default class Parent {b() {// 此处可以访问this.$refs.child.a();}}
</script>

 

吐槽:学这个麒麟框架真的像中了佐二助大招雷遁麒麟一样难受(╯﹏╰)

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java生鲜电商平台-深入订单拆单架构与实战

Java生鲜电商平台-深入订单拆单架构与实战 Java生鲜电商中在做拆单的需求&#xff0c;细思极恐&#xff0c;思考越深入&#xff0c;就会发现里面涉及的东西越来越多&#xff0c;要想做好订单拆单的功能&#xff0c;还是相当有难度&#xff0c; 因此总结了一下拆单功能细节&…

python3中Requests将verify设置为False后,取消警告的方式

import requests resp requests.get(https://www.***.com, verifyFalse)调用成功但是会有如下警告信息&#xff1a; InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedo…

博弈论学习笔记

决定近段时间复习一下博弈论顺便写点笔记。 大佬博客&#xff1a;几种常见博弈模型https://blog.csdn.net/wr132/article/details/51213331 SG函数与SG定理https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html 无敌的博弈总结https://blog.csdn.net/acm_cxlove/article…

Element-UI中Drawer抽屉去除标题自带蓝色框

当点击事件drawertrue时&#xff0c;抽匣回打开 这时抽匣的标题会出现一个难看的蓝色边框&#xff0c;一会就会消失&#xff0c;但是好丑&#xff0c;所以要去掉它 解决方法 /deep/ :focus {outline: 0;} vue组件中&#xff0c;在style设置为scoped的时候&#xff0c;里面在…

Java生鲜电商平台-高并发核心技术订单与库存实战

Java生鲜电商平台-高并发核心技术订单与库存实战 一、 问题 一件商品只有100个库存&#xff0c;现在有1000或者更多的用户来购买&#xff0c;每个用户计划同时购买1个到几个不等商品。 如何保证库存在高并发的场景下是安全的&#xff1f; &#xff08;1&#xff09;不多发 &…

Vue2 MVVM 双向绑定(数据劫持+发布者-订阅者模式)

参考文献&#xff1a;https://www.cnblogs.com/libin-1/p/6893712.html https://juejin.im/post/5b2f0769e51d45589f46949e MVVM拆开来即为Model-View-ViewModel&#xff0c;有View&#xff0c;ViewModel&#xff0c;Model三部分组成。View层代表的是视图、模版&#xff0c;负…

常用的激活函数

1.阶跃函数 &#xff0c;值域{0,1} 1 def step_function(x): 2 return np.array(x>0,dtypenp.int) 2.sigmoid函数 &#xff0c;值域(0,1) 1 def sigmoid(x): 2 return 1/(1np.exp(-x)) 3.relu函数 &#xff0c;值域[0&#xff0c;∞&#xff09; 1 def relu(x): 2 …

前端优化-vue-cli4安装webpack-bundle-analyzer分析包文件

使用vue-cli3创建了一个工程目录&#xff0c;技术栈为vue-cli3vue-routervuexelement-uiv-chartsaxios。但是等到项目开发完后&#xff0c;发现生成的app.js特别大&#xff0c;接近10M。为了优化项目性能&#xff0c;需要使用webpack-bundle-analyzer分析包文件&#xff0c;找出…

不要再问我三次握手和四次挥手

三次握手和四次挥手是各个公司常见的考点&#xff0c;也具有一定的水平区分度&#xff0c;也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好&#xff0c;但是后面越回答越冒冷汗&#xff0c;最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官&#xff1…

VScode PowerShell运行脚本报错禁止运行脚本解决方式图文

今天在新Windows电脑上用VScode的终端PowerShell运行一个脚本的时候&#xff0c; 错误 在vscode终端运行vue -V查看版本失败 PS C:\Users\11388> vue -V vue : 无法加载文件 E:\NodeJs\node_global\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xf…

添加右键用Sublime Text3 打开文件和文件夹

最近重新装了一下系统&#xff0c;右键没有用Sublime Text 3打开的选项了&#xff0c;于是查了一下解决方案 1、环境 Win10和Win7都可以Sublime Text 3最新版本以下为Win10系统下截图 2、添加右键打开文件 Win R&#xff0c;输入regedit,打开注册表 找到HKEY_CLASSESS_ROOT…

Windows Mobile Widget Emulator

今天Vimpyboy 在codeplex发布了Windows Mobile Widget Emulator。这是一个用来调试Windows Mobile 6.5 Widget的工具&#xff0c;我在做Windows Mobile 6.5 新功能widget开发 的时候就发现调试Widget很麻烦。也有想法做一个Emulator&#xff0c;其实这个Emulator目标很明显&…

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

忘记网址了…… 问题&#xff1a; 分析思路与解决方法&#xff1a; 转载于:https://www.cnblogs.com/bravesunforever/p/11247988.html

Java生鲜电商平台-促销架构以及秒杀解决方案实战

Java生鲜电商平台-促销架构以及秒杀解决方案实战 背景:随着这几年的电商的大热,我们经常看到一些商家为了促销和快速收益,纷纷推出了秒杀活动.不管是日常的超市里面的促销,明星演唱会门票售卖,还是春节订阅火车票,等等我们都能看到秒杀活动的影子. 1. 构建秒杀活动架构 1.1 说明…

PHP Cookie处理

Cookie 是什么&#xff1f; cookie是保存在客户端的信息包&#xff08;一个文件&#xff09; cookie 常用于识别用户。 cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时&#xff0c;这台计算机将会发送 cookie。通过 PHP&#xff0c;您能…

PHP-连接数据库

1.2 连接数据库 通过PHP做MySQL的客户端 1.2.1 开启mysqli扩展 在php.ini中开启mysqli扩展 extensionphp_mysqli.dll开启扩展后重启服务器&#xff0c;就可以使用mysqli_函数了&#xff0c;1.2.2 连接数据库 创建news数据库 -- 创建表 drop table if exists news; create …

python模块初始与time、datetime及random

模块初始与time、datetime及random 模块初始 模块的概念&#xff08;本质为一个py文件&#xff09; python模块可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段&#xff0c;这些自我包含的有组织 的代码段就是模块&#xff0c;模块在物理形式上表…

PHP-面向对象编程教程

1.2 面向对象介绍 1.2.1 介绍 面向对象是一个编程思想。编程思想有面向过程和面向对象 面向过程&#xff1a;编程思路集中的是过程上 面向对象&#xff1a;编程思路集中在参与的对象 以去饭馆吃饭为例&#xff1a; ​ 面向过程&#xff1a;点菜——做菜——上菜——吃饭—…

Java生鲜电商平台-统一异常处理及架构实战

Java生鲜电商平台-统一异常处理及架构实战 补充说明&#xff1a;本文讲得比较细&#xff0c;所以篇幅较长。 请认真读完&#xff0c;希望读完后能对统一异常处理有一个清晰的认识。 背景 软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&…

VScode新建自定义模板快捷方式

VS新建vue文件的自定义模板 在使用vscode开发的时候&#xff0c;新建vue文件是不可或缺的&#xff0c;但是VSCode并没有vue文件的初始化模板&#xff0c;这个需要自定义模板。 我们可以使用vscode的snippets在新建.vue 文件后轻松获得一套模板。 具体步骤 打开VSCode -> …