vue 之组件

作者: ysp123 | 来源:发表于2019-01-07 18:09 被阅读0次

    vue组件可扩展html文件,封装重用代码。

    1.组件注册

      1.1 局部注册:只能在注册该组件的实例中使用,一处注册,一处使用
       用法示列:

    <scritp>
            const  testcom = Vue.extends({
                    template: '<div>组件测试1111111111</div>'
            });
        或:
           const testcom from 'testcom.vue';

        export default{
             components:{
                    'testcom':testcom,
                    'comone':{template:'<div>局部组件</div>' }
              }
        }
    </script>   

    <template>
            <testcom></testcom>
            <comone></comone>
    </template>

        1.2全局注册
    <script>
           Vue.component('com',{
                template: '<div>组件测试</div>'
           });
    或者:
          const testcom = Vue.extend({
                 template: '<div>组件测试1111111111</div>'
           });
           Vue.component('testcom',testcom);
    </script>

    <template>
            <comone></comone>
            <com></com>
    </template>

    2、props 数据传递

         父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。
         props 传递分为普通传递和动态传递:
         普通传递:父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop"。(备注:普通传递的若为数字,传递的选项声明 "prop" 前边需加 : )
         动态传递:类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件

    示列:   

    子:  com.vue
          <template>
               <div>
                    {{message}}
                    {{text}}
                    {{num}}
                </div>
          </template>
          <script>
                export default{
                        props:[message, text, num ]
                }
         </script>
    父: app.vue
     <template> <div class="h">
                <!-- 静态传递  -->
                <com-demo message="hello vue!"></com-demo>
                <!--  动态传递  -->
               <com-demo :text="text"></ com-demo>
                <!--- 数字传递 -->
                <com-demo :num="123"></ com-demo> 
      </div></template> 

         import comDemo from './com.vue';
        export default{ 
              data(){
                    return { text: 'hello mr. magoo' }
             },
            components:{ 'comDemo ':comDemo }

    结果:hello vue!  hello mr. magoo  123

    Prop 验证:组件可以为 props 指定验证要求。prop 是一个对象而不是字符串数组时,它包含验证要求:

    Vue.component('example', {
             props: {
                 propA: Number,  // 基础类型检测 (`null` 意思是任何类型都可以)
                 propB: [String, Number], // 多种类型
                 propC: { type: String, required: true },  // 必传且是字符串
                 propD: { type: Number, default: 100 },// 数字,有默认值 
                 propE: { type: Object, default: function () { return { message: 'hello' } } },// 数组、对象的默认值应当由一个工厂函数返回
                 propF: { validator: function (value) { return value > 10 } } // 自定义验证函数
     }})

    type 可以是下面原生构造器:String 、Number、Boolean、Function、Object、Array、type 也可以是一个自定义构造器,使用 instanceof 检测。 

    3、自定义事件

    父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
    我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:
            使用 $on(eventName) 监听事件    
            使用 $emit(eventName) 触发事件
    另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
    以下实例中子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。

    <div id="app"> <div id="counter-event-example">   
             <p>{{ total }}</p>
             <button-counter v-on:increment="incrementTotal"></button-counter>
             <button-counter v-on:increment="incrementTotal"></button-counter>
     </div></div>
    <script>
        Vue.component('button-counter', {
            template: '<button v-on:click="incrementHandler">{{ counter }}</button>',
            data: function () {
                return { counter: 0}
            },
            methods: {
                incrementHandler: function () {
                        this.counter += 1;
                        this.$emit('increment');
                }},
            })
    //父组件:
        new Vue({
            el: '#counter-event-example',
            data: {
                total: 0
            },
            methods: {
                incrementTotal: function () {
                    this.total += 1
            }}
    })</script>

    相关文章

      网友评论

        本文标题:vue 之组件

        本文链接:https://www.haomeiwen.com/subject/nkaurqtx.html