开课吧-第一课vue组件化实践 (写组件库)

555 阅读2分钟

需要学习源码\nodejs

课程体系:

vue.js 8-9次课

组件化

组件通信

父组件-》子组件

    ·属性props
    //child
    props:{msg:String}
    //parent
    <Helloworld mesg="welcome to your vue.js"></Helloworld>
    ·引用refs
    //parent
    <Helloworld ref="hw"/>
    this.$refs.hw.xx='xxxx'(放在mounted,不能放在created,父组件先于子组件,否则得不到hw)
    ·子元素children
    //parent
    this.$children[0].xx='xxxx'(子元素不保证顺序,也不保证相应式)

子组件-》父组件:自定义事件

    //child
    this.$emit('add',good)
    //parent
    <Card @add="carAdd($event)"></Card>
    (类似观察者模式,谁派发谁监听)

兄弟组件:通过共同祖辈组件

    通过共同的祖辈组件搭桥,$parent或$root
    //brother1
    this.$parent.$on('foo',handle)
    //brother2
    this.$parent.$emit('foo')

祖先和后代之间

    由于嵌套层数过多,传递props不切实际,vue提供了provide/inject API完成该任务
    ·provide/inject:能够实现祖先给后代传值
    //ancestor
    provide(){
        return {foo:'foo'}
    }
    //descendant
    inject:['foo']
    *注意provide和inject主要为高阶插件/组件提供用例。并不推荐直接用于应用程序代码,我们更会在开源组件库中见到。建议注入进来的值不要改动
    但是,反过来想要后代给祖先传值这种方案就不行了

任意两个组件之间:事件总线或vuex

    ·事件总线:创建一个Bus类负责事件派发、监听和回调管理
    //Bus:事件派发、监听和回调管理
    Class Bus{
        constructor(){
            this.callbacks={}
        }
    }
    $on(name,fn){
        this.callbacks[name] = this.callbacks[name]||[]
        this.callbacks[name].push(fn)
    }
    $emit(name,fn){
        if(this.callbacks[name]){
            this.callbacks[name].forEach(cb=>cb(args))
        }
    }
    //main.js
    Vue.prototype.$bus = new Bus();
    //child1
    this.$bus.$on('foo',handle);
    //child2
    this.$bus.$emit('foo');
    *实践中可以用Vue代替Bus,因为它已经实现了相应的功能
vuex:创建唯一的全局数据管理者store,通过它管理数据并通知组件状态变更
    范例:组件通信
        组件通信范例代码请参考components/comunicate
插槽
    插槽语法是Vue实现的内容分发API,用于复合组件开发。该技术在通用组件库开发中有大量应用。
    Vue2.6.0之后采用全新v-slot语法取代之前的slot\slot-scope
匿名插槽
    //comp1
    <div><slot></slot></div>
    //parent
    <comp>hello</comp>
具名插槽
    将内容分发到子组件指定位置
    //comp2
    <div>
        <slot></slot>
        <slot name="content"></slot>
    </div>
    //parent
    <comp2>
        <!--默认插槽用default做参数-->
        <template v-slot:default>具名插槽</template>
        <!--具名插槽用插槽名做参数-->
        <template v-slot:content></template>
    </comp2>
作用域插槽
    分发内容要用到子组件中的数据
    //comp3
    <div>
        <slot :foo="foo"></slot>
    </div>
    //parent
    <Comp3>
        <template v-slot:default="slotProps">(slotProps 形参)
            来自子组件数据:{{slotProps.foo}}
        </template>
    </Comp3>
    范例

组件化实战

    实现Form 管理数据模型-model、校验规则-rules、全局校验方法-validate
        \FormItem显示标签-label、执行校验-prop和显示校验结果
            \Input绑定数据模型-v-model、通知ForItem执行校验
    需要思考几个问题?
    1.input是自定义组件,它是怎么实现数据绑定的?
    2.FormItem怎么知道何时执行校验,校验的数据和规则怎么得到?
    3.Form怎么进行全局校验?它用什么办法把数据模型和校验规则传递给内部组件?
    
        最终效果:Element表单
        组件设计
        实现KInput
            ·任务1:实现自定义组件双向绑定功能
            (.sync也可实现双向绑定)
            (子组件 v-bind="$attrs",代表props之外的值)
            (子组件inheritAttrs:false避免顶层属性继承属性)
        使用KInput
        实现KFormItem
            ·任务1:给input预留插槽-slot
            ·任务2:能够展示label和校验信息
            ·任务3:能够进行校验
        使用KFormItem
        实现KForm
        使用KForm
        数据校验
    实现弹窗组件
        create
        通知组件
        使用create api
递归组件
    递归组件是可以在它们自己模板中调用自身的组件。
    实现Tree组件
        组件设计
        实现Item组件
        使用

扩展sync 用法

<template>
    <div class="details">
        <myComponent :show.sync='valueChild' style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent>
        <button @click="changeValue">toggle</button>
    </div>
</template>
<script>
import Vue from 'vue'
Vue.component('myComponent', {
      template: `<div v-if="show">
                    <p>默认初始值是{{show}},所以是显示的</p>
                    <button @click.stop="closeDiv">关闭</button>
                 </div>`,
      props:['show'],
      methods: {
        closeDiv() {
          this.$emit('update:show', false); //触发 input 事件,并传入新值
        }
      }
})
export default{
    data(){
        return{
            valueChild:true,
        }
    },
    methods:{
        changeValue(){
            this.valueChild = !this.valueChild
        }
    }
}
</script>

课程目标

    1.深入理解vue的组件机制 掌握vue组件化常用技术
    2.能够设计并实现多种类型的组件
    3.通过组件化实践加深对vue原理理解

资源

    1.vuejs2.6.x(https://cn.vuejs.org/)
    2.vue-cli3.x(https://cli.vuejs.org/)

组件化

    组件化是vue的核心思想,主要目的是为了代码重用。
    
    
2.vue全家桶&原理
3.手写vue源码
4.vue源码剖析
5.vue项目最佳实践 (开发手段技巧)
6.服务端渲染ssr
7.ts及vue应用