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,一经查实,立即删除!

相关文章

Markdown 语法简介

这是标题一 标题二 标题三 print(hello) 这是一个python 第一点 thiw dhaishd 第二点 转载于:https://www.cnblogs.com/BlogOfEr/p/11229682.html

kylinH5框架之项目开发调试

进行开发调试&#xff0c;需要完成以下步骤&#xff1a; 安装依赖开发调试构建生产 点击 代码示例&#xff0c;获取 Kylin Demo&#xff0c;并完成以下操作。 安装依赖 进入项目根目录&#xff0c;使用 cnpm 安装 npm 依赖&#xff1a; # 安装npm依赖 cnpm install 开发调试…

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…

kylinH5框架之项目脚手架

页面介绍 Page 是一个 Webview 的逻辑抽象层&#xff0c;同时也是组件挂载的根节点。 代码引入 import { Page } from ali/kylin-framework; 页面声明结构 一个Page包含的接口在页面接口中声明&#xff0c;提供了对 Vue 实例的完整控制能力&#xff0c;简易的 Page 使用如…

博弈论学习笔记

决定近段时间复习一下博弈论顺便写点笔记。 大佬博客&#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…

Promise链式调用和解决回调地狱的ES7终极解决方法async,await

promise链式调用 **then 是成功回调&#xff0c;只要在then后边return一个promise就可以继续then**<script type"text/javascript">let p1new Promise(function(resolve,reject){setTimeout(function(){resolve()//成功回调// reject()//失败回调},2000)//2秒…

1.MySQL目录结构

分为两个目录&#xff1a; 1.安装目录&#xff1a; 2.数据目录&#xff1a; 在Linux下 yum安装mysql后使用 find / -name my.cnf 找到mysql数据文件的位置 转载于:https://www.cnblogs.com/sdrbg/p/11237231.html

对promise.all底层的实现的研究

1.Promise.all(iterable)返回一个新的Promise实例,此实例在iterable参数内素有的Promise都fulfilled或者参数中不包含Promise时&#xff0c;状态变成fulfilled。 如果参数中Promise有一个失败rejected &#xff0c;此实例回调失败&#xff0c;失败原因的是第一个失败Promise的返…

vue-provide/inject轻松实现跨级访问祖先组件

provide&#xff1a;Object | () > Object inject&#xff1a;Array<string> | { [key: string]: string | Symbol | Object } provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。是2.2.0版本 新增的。 这对选项需要一起使用&#x…

python 操作redis,存取为字节格式,避免转码加

这种情况连接数据库&#xff0c;对数据的存取都是字节类型&#xff0c;存取时还得转码一下 from redis import Redis# 实例化redis对象rdb Redis(hostlocalhost, port6379, db0,passwordaaa123) rdb.set(name, root) name rdb.get(name) print(name)为了避免上述情况&#x…

element ui table scrollTop 滚动到行头或行尾

1.设置table的ref为tableList2.设置滚动至顶部this.$refs.tableList.bodyWrapper.scrollTop 0;3.设置滚动至底部this.$refs.tableList.bodyWrapper.scrollTop this.$refs.tableList.bodyWrapper.scrollHeight;//如果请求完更新数据&#xff0c;需要使用$nextTick this.$nextTic…

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

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

Java生鲜电商平台-B2B生鲜的互联网思维

Java生鲜电商平台-B2B生鲜的互联网思维 在互联网高速发展的今天&#xff0c;为我们的生活带来了众多便利。然而互联网从早期的萌芽状态到现在妇孺皆知&#xff0c;它的崛起速度远远超乎世人的想象。人们开始关注互联网并且研究它&#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;找出…

今天刚查到的宏,学习

PVP常用的宏&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&…

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

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