上海电子通科技网站建设,怎么做网站流量,wordpress wap跳转,怎么用阿里云服务器做网站如果您已经对 Vue.js 组件的基础用法了如指掌#xff0c;可以跳过本小节#xff0c;不过当做复习稍读一下也无妨。 组件的构成
一个再复杂的组件#xff0c;都是由三部分组成的#xff1a;prop、event、slot#xff0c;它们构成了 Vue.js 组件的 API。如果你开发的是一个… 如果您已经对 Vue.js 组件的基础用法了如指掌可以跳过本小节不过当做复习稍读一下也无妨。 组件的构成
一个再复杂的组件都是由三部分组成的prop、event、slot它们构成了 Vue.js 组件的 API。如果你开发的是一个通用组件那一定要事先设计好这三部分因为组件一旦发布后面再修改 API 就很困难了使用者都是希望不断新增功能修复 bug而不是经常变更接口。如果你阅读别人写的组件也可以从这三个部分展开它们可以帮助你快速了解一个组件的所有功能。
属性 prop
prop 定义了这个组件有哪些可配置的属性组件的核心功能也都是它来确定的。写通用组件时props 最好用对象的写法这样可以针对每个属性设置类型、默认值或自定义校验属性的值这点在组件开发中很重要然而很多人却忽视直接使用 props 的数组用法这样的组件往往是不严谨的。比如我们封装一个按钮组件 i-button
templatebutton :classi-button-size size :disableddisabled/button
/template
script// 判断参数是否是其中之一function oneOf (value, validList) {for (let i 0; i validList.length; i) {if (value validList[i]) {return true;}}return false;}export default {props: {size: {validator (value) {return oneOf(value, [small, large, default]);},default: default},disabled: {type: Boolean,default: false}}}
/script使用组件
i-button sizelarge/i-button
i-button disabled/i-button组件中定义了两个属性尺寸 size 和 是否禁用 disabled。其中 size 使用 validator 进行了值的自定义验证也就是说从父级传入的 size它的值必须是指定的 small、large、default 中的一个默认值是 default如果传入这三个以外的值都会抛出一条警告。
要注意的是组件里定义的 props都是单向数据流也就是只能通过父级修改组件自己不能修改 props 的值只能修改定义在 data 里的数据非要修改也是通过后面介绍的自定义事件通知父级由父级来修改。
在使用组件时也可以传入一些标准的 html 特性比如 id、class
i-button idbtn1 classbtn-submit/i-button这样的 html 特性在组件内的 button 元素上会继承并不需要在 props 里再定义一遍。这个特性是默认支持的如果不期望开启在组件选项里配置 inheritAttrs: false 就可以禁用了。
插槽 slot
如果要给上面的按钮组件 i-button 添加一些文字内容就要用到组件的第二个 API插槽 slot它可以分发组件的内容比如在上面的按钮组件中定义一个插槽
templatebutton :classi-button-size size :disableddisabledslot/slot/button
/template这里的 slot 节点就是指定的一个插槽的位置这样在组件内部就可以扩展内容了
i-button按钮 1/i-button
i-buttonstrong按钮 2/strong
/i-button当需要多个插槽时会用到具名 slot比如上面的组件我们再增加一个 slot用于设置另一个图标组件
templatebutton :classi-button-size size :disableddisabledslot nameicon/slotslot/slot/button
/templatei-buttoni-icon sloticon typecheckmark/i-icon按钮 1
/i-button这样父级内定义的内容就会出现在组件对应的 slot 里没有写名字的就是默认的 slot。
在组件的 slot 里也可以写一些默认的内容这样在父级没有写任何 slot 时它们就会出现比如
slot提交/slot自定义事件 event
现在我们给组件 i-button 加一个点击事件目前有两种写法我们先看自定义事件 event部分代码省略
templatebutton clickhandleClickslot/slot/button
/template
scriptexport default {methods: {handleClick (event) {this.$emit(on-click, event);}}}
/script通过 $emit就可以触发自定义的事件 on-click 在父级通过 on-click 来监听
i-button on-clickhandleClick/i-button上面的 click 事件是在组件内部的 button 元素上声明的这里还有另一种方法直接在父级声明但为了区分原生事件和自定义事件要用到事件修饰符 .native所以上面的示例也可以这样写
i-button click.nativehandleClick/i-button如果不写 .native 修饰符那上面的 click 就是自定义事件 click而非原生事件 click但我们在组件内只触发了 on-click 事件而不是 click所以直接写 click 会监听不到。
组件的通信
一般来说组件可以有以下几种关系 A 和 B、B 和 C、B 和 D 都是父子关系C 和 D 是兄弟关系A 和 C 是隔代关系可能隔多代。组件间经常会通信Vue.js 内置的通信手段一般有两种
ref给元素或组件注册引用信息$parent / $children访问父 / 子实例。
这两种都是直接得到组件实例使用后可以直接调用组件的方法或访问数据比如下面的示例中用 ref 来访问组件部分代码省略
// component-a
export default {data () {return {title: Vue.js}},methods: {sayHello () {window.alert(Hello);}}
}templatecomponent-a refcomA/component-a
/template
scriptexport default {mounted () {const comA this.$refs.comA;console.log(comA.title); // Vue.jscomA.sayHello(); // 弹窗}}
/script$parent 和 $children 类似也是基于当前上下文访问父组件或全部子组件的。
这两种方法的弊端是无法在跨级或兄弟间通信比如下面的结构
// parent.vue
component-a/component-a
component-b/component-b
component-b/component-b我们想在 component-a 中访问到引用它的页面中这里就是 parent.vue的两个 component-b 组件那这种情况下就得配置额外的插件或工具了比如 Vuex 和 Bus 的解决方案本小册不再做它们的介绍读者可以自行阅读相关内容。不过它们都是依赖第三方插件的存在这在开发独立组件时是不可取的而在小册的后续章节会陆续介绍一些黑科技它们完全不依赖任何三方插件就可以轻松得到任意的组件实例或在任意组件间进行通信且适用于任意场景。
结语
本小节带您复习了 Vue.js 组件的核心知识点虽然这并没有完全覆盖 Vue.js 的 API但对于组件开发来说已经足够了后续章节也会陆续扩展更多的用法。
基于 Vue.js 开发独立组件并不是新奇的挑战坦率地讲它本质上还是 JavaScript。掌握了 Vue.js 组件的这三个 API 后剩下的便是程序的设计。在组件开发中最难的环节应当是解耦组件的交互逻辑尽量把复杂的逻辑分发到不同的子组件中然后彼此建立联系在这其中计算属性computed和混合mixins是两个重要的技术点合理利用就能发挥出 Vue.js 语言的最大特点把状态数据的维护交给 Vue.js 处理我们只专注在交互上。
当您最终读完本小册时应该会总结出和笔者一样的感悟Vue.js 组件开发玩到最后还是在拼 JavaScript 功底。对于每一位使用 Vue.js 的开发者来说阅读完本小册都可以尝试开发和维护一套属于自己的组件库并乐在其中而且你会越发觉得一个组件或一套组件库就是融合了前端精髓的产出。
扩展阅读
Vue 组件通信之 BusVuex通俗版教程