• Vue学习笔记Vue.js2.X 学习(二)===>组件化开发


    ===重点重点开始 ==========================

    (三) 组件化开发

    1.创建组件构造器: Vue.extends()

    2.注册组件: Vue.component()

    3.使用组件(全局和局部组件)

    一般方式:全局和局部组件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 3.使用组件(要放到一个签中(<div>)) -->
        <div>
            <zjm></zjm>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 1. 创建组件模版(一般方式)
        const 组件名 = Vue.extend({
            template: `<div><h2>一般方式的组件内容</h2></div>`
        })
        // 2.注册全局组件(标签名+组件名),可以在多个vue实例中使用,开如中一般不用全局组件.
        Vue.component('zjm', 组件名)
    
        // Vue实例对象(开发中一般只有一个vue实例)
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {},
            // 2.注册局部组件(标签名+组件名)
            // components: {
            //     zjm: 组件名
            // }
        })
    </script>
    </body>
    </html>
    
    一般方式:全局和局部组件
    一般方式:全局和局部组件

    语法糖方式:全局和局部组件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 3.使用组件 -->
        <div>
            <qjzjm></qjzjm>
        </div>
        <div>
            <jbzjm></jbzjm>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 1-2.创建注册全部组件(语法糖方式)
        Vue.component('qjzjm', {
            template: `<div><h2>全局组件内容-语法糖</h2></div>`
        })
        // root根组件
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {},
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                'jbzjm': {
                    template: `<div><h2>局部组件内容-语法糖</h2></div>`
                }
            }
        })
    </script>
    </body>
    </html>
    
    语法糖方式
    语法糖方式

    4.模板分离(2种方法)

    方法1: <script>标签方法(一般不用)

    方法2: 使用<template>标签方法(常用)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!--4.使用组件-->
        <div>
            <qjcpn></qjcpn>
            <jbcpn></jbcpn>
        </div>
    </div>
    <!--3.分离组件中的模板,使用template标签方法,设id对应相应的组件,通过id联系在一起-->
    <template id="qjzjm">
        <div>
            <h1>全部组件:使用template标签方法,分离组件中的模板!</h1>
        </div>
    </template>
    <template id="jbzjm">
        <div>
            <h1>局部组件:使用template标签方法,分离组件中的模板!</h1>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 1-2.创建注册全部组件(语法糖方式),取个名字,后面跟个对象即可创建.
        Vue.component('qjcpn', {
            template: '#qjzjm',
            data() {
                return {
                    msg: '组件中的msg数据'
                }
            }
        })
        const app = new Vue({
            el: '#app',
            data: {},
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                'jbcpn': {
                    template: `#jbzjm`
                }
            }
        })
    </script>
    </body>
    </html>
    
    使用template标签方法
    使用template标签方法

    5.组件中数据,组件中的data必需是一个函数,同时返回是一个对象,vue实例中是一个属性不是一个函数,二者的数据不能直接访问,每次使用组件时就会调用data()函数,如果不是函数,组件在二次使用时,就会出现同一个数据.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
    <!--4.使用组件-->
        <cpn></cpn>  
        <cpn></cpn>
        <h1>{{msg}}</h1>
    </div>
    <template id="mytemplate">
        <div>
            <h1>方法2:使用template标签方法,分离组件中的模板!</h1>
            <h1>{{msg}}</h1>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
    // 1.注册一个全局组件,取个名字,后面跟个对象即可创建.
        Vue.component('cpn',{
            // 2.分离模板要对应模板中的id(#mytemplate)
            template:'#mytemplate',
            // 这里必需是一个函数,同时返回是一个对象.
            data(){
                return {
                    msg: '组件中的msg数据'
                }
            }
        })
        const app = new Vue({
            el: '#app',
            data: {
                msg: '实例中的msg数据'
            }
        })
    </script>
    </body>
    </html>
    组件中的data必需是一个函数

     加减实例(组件内数据data为什么是一个函数实例说明)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
    <!--4.使用组件,重复使用不相互影响-->
        <cpn></cpn>
        <cpn></cpn>
    </div>
    <template id="mytemplate">
        <div>
            <h1>当前计数:{{counter}}</h1>
            <button @click="zj">增加+</button>
            <button @click="js">减少-</button>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
    // 1.注册一个全局组件,取个名字,后面跟个对象即可创建.
        Vue.component('cpn',{
            // 2.分离模板要对应模板中的id(#mytemplate)
            template:'#mytemplate',
            // 这里必需是一个函数,同时返回是一个对象,这样重复使用就不相互影响.
            data(){
                return {
                    msg: '组件中的msg数据',
                    counter: 0
                }
            },
            methods:{
                zj(){this.counter++},
                js(){this.counter--}
            },
        })
        const app = new Vue({
            el: '#app',
            data: {
                msg: '实例中的msg数据'
            }
        })
    </script>
    </body>
    </html>
    加减实例

     

    6.父子组件 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 4.使用组件 -->
        <fzjm></fzjm>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 1. 创建组件模版(子组件)
        const zzjm = Vue.extend({
            template: `<div><h2>组件内容1-子组件名zzjm</h2></div>`
        })
    
        // 2. 创建组件模版(父组件,将子组件放到父组件中)
        const fzjm = Vue.extend({
            template: `
                <div>
                    <h2>组件内容2-父组件名fzjm</h2>
                    <!--// 在父组件中使用子组件-->
                    <zzjm></zzjm>
                </div>
                `,
            components: {
                zzjm: zzjm,
            }
        })
        // root根组件
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {},
            // 3.注册局部组件(标签名+组件名)
            components: {
                // 将父组件放到Vue实例root根组件中,没有在根组件中注册的组件不能直接使用(组件名1不能直接使用).
                fzjm: fzjm,
            }
        })
    </script>
    </body>
    </html>
    
    父子组件一般方式
    父子组件一般方式

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 4.使用组件 -->
        <fzjm></fzjm>
    </div>
    <template id="zzjmb">
        <div>
            <h2>子组件在父组件中使用:使用template标签方法,分离组件中的模板!</h2>
        </div>
    </template>
    <template id="fzjmb">
        <div>
            <h1>父组件</h1>
            <!--// 在父组件中使用子组件-->
            <zzjm></zzjm>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // 1. 创建组件模版(子组件)
        const zzjm = Vue.extend({
            template: '#zzjmb'
        })
        // 2. 创建组件模版(父组件,将子组件放到父组件中)
        const fzjm = Vue.extend({
            template: '#fzjmb',
            components: {
                zzjm: zzjm,
            }
        })
        // root根组件
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {},
            // 3.注册局部组件(标签名+组件名)
            components: {
                // 将父组件放到Vue实例root根组件中,没有在根组件中注册的组件不能直接使用(组件名1不能直接使用).
                fzjm: fzjm,
            }
        })
    </script>
    </body>
    </html>
    
    父子组件模版分离方式
    父子组件模版分离方式

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 4.使用子组件 -->
        <zzjm></zzjm>
    </div>
    <!--3.子组件模板-->
    <template id="zzjmb">
        <div>
            <h2>常用子组件在根组件(父组件)中使用</h2>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // root根组件(父组件,开发中一般是这种写法)
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {},
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                'zzjm': {
                    template: '#zzjmb'
                }
            }
        })
    </script>
    </body>
    </html>
    
    父子组件在根组件中使用(常用)
    父子组件在根组件中使用(常用)

    7.组件模板中的数据,不能直接在根组件中显示

    <body>
        <div id="app">
            <!-- 4.使用组件 -->
            <zjm2></zjm2>
            <!-- 不能直接用组件2中的数据的,同时要报错! -->
            {{title}}
        </div>
        <template id="zjm2">
            <div>
                <h2> 组件2内容</h2>
                <h2> {{title}}</h2>
            </div>
        </template>
        <script>
            // root根组件 
            const app = new Vue({
                el: '#app', //挂载管理元素
                data: {},
                // 1-2.创建注册局部组件(语法糖方式)
                components: {
                    zjm2: {
                        template: '#zjm2',
                        data() {
                            return {
                                title: '组件2中的数据'
                            }
    
                        }
                    }
                }
            })
        </script>
    </body>
    组件模板中的数据

    8.父子组件的通信(数据的传递)

    A:父传子: props

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
        <zzj1 v-bind:users1='users' v-bind:msg1='msg'> </zzj1>
    </div>
    <!-- 3.子组件模版 -->
    <template id="zzjmb">
        <div>
            <!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
            <h2>props父组件中的值:{{users1}}</h2>
            <h2>props父组件中的值:{{msg1}}</h2>
            <h2>props父组件中的值:循环对象中的值</h2>
            <ul>
                <li v-for='item in users1'>{{item}}</li>
            </ul>
            <!--子组件data中的数据-->
            <h2>{{title}}</h2>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // root根组件(父组件)
        const app = new Vue({
            el: '#app',
            // 将下面data中数据传给子组件展示
            data: {
                msg:'长安镖局',
                users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ]
            },
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                zzj1: {
                    template: '#zzjmb',
                    data() {return {title: '子组件data中的数据'}
                    },
                    // 4.设置绑定父组件中的变量名users1,msg1
                    // 方法一:数组的写法,很少用.
                    props: ['users1', 'msg1']
                }
            }
        })
    </script>
    </body>
    </html>
    
    数组写法(很少用)
    数组写法(很少用)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
        <zzj1 v-bind:users1='users' v-bind:msg1='msg'> </zzj1>
    </div>
    <!-- 3.子组件模版 -->
    <template id="zzjmb">
        <div>
            <!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
            <h2>props父组件中的值:{{users1}}</h2>
            <h2>props父组件中的值:{{msg1}}</h2>
            <h2>props父组件中的值:循环对象中的值</h2>
            <ul>
                <li v-for='item in users1'>{{item}}</li>
            </ul>
            <!--子组件data中的数据-->
            <h2>{{title}}</h2>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // root根组件(父组件)
        const app = new Vue({
            el: '#app',
            // 将下面data中数据传给子组件展示
            data: {
                msg:'长安镖局',
                users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ]
            },
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                zzj1: {
                    template: '#zzjmb',
                    data() {return {title: '子组件data中的数据'}
                    },
                    // 4.设置绑定父组件中的变量名users1,msg1
                    // 方法一:数组的写法,很少用.
                    // props: ['users1', 'msg1']
                    // 方法二:对象的写法
                    props: {
                        users1: Array, //Array数组类型,String字符型,还可以指定验证要求,设置默认值,变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
                        msg1:Array
                    }
                }
            }
        })
    </script>
    </body>
    </html>
    对象写法(常用)
    对象写法(常用)

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
        <zzj1 v-bind:msg1='msg' v-bind:users1='users'> </zzj1>
    </div>
    <!-- 3.子组件模版 -->
    <template id="zzjmb">
        <div>
            <!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
            <h2>props父组件中的值:{{users1}},{{msg1}}</h2>
            <h2>props父组件中的值:循环显示对象中的值</h2>
            <ul><li v-for='item in users1'>{{item}}</li></ul>
            <!--子组件data中的数据-->
            <h2>{{title}}</h2>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            // 将下面data中数据传给子组件展示
            data: {
                users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ],
                msg:'长安镖局'
            },
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                zzj1: {
                    template: '#zzjmb',
                    data() {return {title: '子组件data中的数据'}
                    },
                    // 4.设置绑定父组件中的变量名users1,msg1
                    // 方法一:数组的写法,很少用,里面是一个变量名.
                    // props: ['users1', 'msg1']
                    // 方法二:对象的写法,设置变量名同时设定他的类型.
                    // 变量名为users1: 变量名类型为数组Array, 变量名为msg1: 变量名类型为字符型String.
                    // props: {
                    //     users1: Array,  // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
                    //     msg1:String
                    // }
                    props: {
                        users1: Array,  // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
                        msg1: {
                            type:String,
                            default:'我是长安镖局!'  // 如果前面没有传值就显示默认的值
                        },
                        // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
                        // propA: Number,
                        // 多个可能的类型
                        // 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 ['success', 'warning', 'danger'].indexOf(value) !== -1
                        //     }
                        // }
                        }
                }
            }
        })
    </script>
    </body>
    </html>
    
    对象写法prop验证类型说明
    对象写法prop验证类型说明

     A:子传父(自定义事件)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!-- 父组件模版 -->
    <div id="app">
        <!-- 6.将子组件传递的事件绑定到父组件中,默认自带子组件的参数值 -->
        <zzj1 @zzjjiajia='fjiajia'></zzj1>
        <!-- 8.展示数据-->
        点击次数:{{total}}
    </div>
    <!-- 3.子组件模版 -->
    <template id="zzjmb">
        <div>
            <!-- 4.子组件绑定事件 -->
            <button @click='jiajia'>+1</button>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // root根组件(父组件)
        const app = new Vue({
            el: '#app', //挂载管理元素
            data: {total: 0},
            // 1-2.创建注册局部组件(语法糖方式)
            components: {
                'zzj1':{
                    template: '#zzjmb',
                    data() {return {num: 0}},
                    methods: {
                        jiajia() {
                            this.num++;
                            // 5.用$emit方法,发射绑定事件和值
                            this.$emit('zzjjiajia', this.num)  // 发射出的事件名称,自已取名,发射的值this.num.
                        }
                    },
                }
            },
            methods: {
                // 7.在父组件中处理子组件传递的事件
                fjiajia(num) {
                    this.total = num  // 将子组件中的num赋值给total
                }
            }
        })
    </script>
    </body>
    </html>
    
    子传父加加例子
    子传父加加例子

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">  <!--父组件模版-->
        <!-- 5.监听子组件item-click发射的事件,自定义接收事件名称(zzjitemclick),这里默认把值item传了过来-->
        <zzj @item-click='zzjitemclick'></zzj>
    </div>
    <template id="zzjmb">  <!--子组件模版 -->
        <div>
            <!--3.绑定点击事件和要传的值(item),自定义事件名称(btnclick),循环分类(fenlei)展示数据-->
            <button v-for="item in fenlei" @click='btnclick(item)'>{{item.name}}</button>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {},
            // 6.在父组件中使用子组件事件和值,这里item和msg都是形参,按传入的位置取值.
            methods: {
                zzjitemclick(item, msg) {
                    console.log(item, msg);
                },
            },
            // 1-2.创建注册局部组件(组件名+对象)
            components: {
                'zzj': {
                    template: '#zzjmb',  // 子组件模版id
                    data() {
                        return {
                            fenlei: [
                                {id: 1, name: '企业用户信息'},
                                {id: 2, name: '业务基础信息'}
                            ],
                            msg: '长安镖局',
                        }
                    },
                    methods: {
                        btnclick(item) {
                            // 4.用$emit方法发射点击事件和值,自定义发射事件的名称(item-click).
                            this.$emit('item-click', item, this.msg)  // 传模版中的数据不能写成this.item,传data中的数据就要加this
                        }
                    }
                }
            }
        })
    </script>
    </body>
    </html>
    
    子传父分类例子
    子传父分类例子

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!--父组件模板-->
    <div id="app">
        <!-- 3.绑定子父组件中值的变量(zusers对应父的users,msg对应zmsg),子组件就可以使用父组件中的数据了,===> 5.展示子组件中数据 -->
        <!-- 8.子传父:3.监听子组件item-click发射的事件,定义一个父组件中使用的事件名zzjitemclick,这里默认把值item传了过来-->
        <zzj v-bind:zusers='users' v-bind:zmsg='msg' @item-click='zzjitemclick'></zzj>
    </div>
    <!--子组件模版 -->
    <template id="zzjmb">
        <div>
            <!-- 4.在子组件中使用父组件的值users和msg,必需用子组件中自定义的变量zusers和zmsg-->
            <!-- 6.子传父:1.将点击事件和值传给父组件,绑定子组件中点击事件@click和item值-->
            <button v-for='item in zusers' @click='btnclick(item,zmsg)'>{{item.name}}</button>
            <h2>父组件中的数据:{{zmsg}}</h2>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            // 将下面data中数据传给子组件展示
            data: {
                users: [
                    {id: 1, name: '企业用户信息'},
                    {id: 2, name: '业务基础信息'} ],
                msg:'长安镖局'
            },
            // 9.子传父:4.在父组件中使用子组件事件和值,这里item和title都是形参,按传入的位置取值.
            methods: {
                zzjitemclick(item,zmsg,title){
                    console.log(item,zmsg,title);
                },
            },
            // 1.创建注册局部子组件(组件名+对象)
            components: {
                zzj: {
                    template: '#zzjmb',  //子组件模版id
                    data() {
                        return {
                            title: '子组件data中的数据',
                        }
                    },
                    // 2.设置父组件中值对应子组件中的变量名,自定义子数据变量名zusers对应父的users,msg对应zmsg.
                    props: {
                        zusers: Array,  // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
                        zmsg: {
                            type: String,
                            default: '我是长安镖局!'  // 如果前面没有传值就显示默认的值
                        }
                    },
                    methods: {
                        btnclick(item,zmsg) {
                            // console.log(item);
                            // 7.子传父:2.用$emit方法,发射点击绑定事件和值,传模版中的数据不加this,传data中的数据就要加this.
                            this.$emit('item-click',item, zmsg,this.title) //自定义发射的事件名称item-click
                        }
                    }
                }
            }
        })
    </script>
    </body>
    </html>
    
    父传子再传父分类例子
    父传子再传父分类例子

     

     

    9.父子组件的访问方式($children)

    A:父组件访问子组件:使用$children或$refs

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!--父组件模版-->
    <div id="app">
        <zzj1></zzj1>  <!--使用子组件1-->
        <zzj1></zzj1>  <!--使用子组件2-->
        <button @click="btnclick">按钮</button>
    </div>
    <!--子组件模版-->
    <template id="zzjmb">
        <div><h2>子组件data中的数据:{{title}}</h2></div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {},
            methods:{
                btnclick(){
                    console.log(this.$children)
                    // 在父组件中执行子组件1中的方法,
                    this.$children[0].showmsg()
                    // 在父组件中执行子组件2中的方法,
                    this.$children[1].showmsg()
                }
            },
            // 1.创建注册局部组件(组件名+对象)
            components: {
                zzj1: {
                    template: '#zzjmb',
                    data() {return {title: '子组件data中的数据'}
                    },
                    methods: {
                        // 子组件里的方法
                        showmsg(){
                            console.log('我是子组件里的方法')
                        }
                    }
                }
            }
        })
    </script>
    </body>
    </html>
    
    父访问子($children)不常用
    父访问子($children)不常用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!--父组件模版-->
    <div id="app">
        <zzj1 ref="ref1"></zzj1>  <!--使用子组件1,加一个属性-->
        <zzj1 ref="ref2"></zzj1>  <!--使用子组件2,加一个属性-->
        <button @click="btnclick">按钮</button>
    </div>
    <!--子组件模版-->
    <template id="zzjmb">
        <div><h2>子组件data中的数据:{{title}}</h2></div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {},
            methods:{
                btnclick(){
                    // $refs对象类型,默认空
                    console.log(this.$refs)
                    // 在父组件中执行子组件1中的方法,
                    this.$refs.ref1.showmsg()
                    // 在父组件中执行子组件2中的方法,
                    this.$refs.ref2.showmsg()
                }
            },
            // 1.创建注册局部组件(组件名+对象)
            components: {
                zzj1: {
                    template: '#zzjmb',
                    data() {return {title: '子组件data中的数据'}
                    },
                    methods: {
                        // 子组件里的方法
                        showmsg(){
                            console.log('我是子组件里的方法')
                        }
                    }
                }
            }
        })
    </script>
    </body>
    </html>
    父访问子($refs)常用
    父访问子($refs)常用

     

    B:子组件访问父组件:使用$parent和$root 实际开发中不建义用.

    Vue学习笔记-Vue.js-2.X 学习(三)

  • 相关阅读:
    RFID基础知识
    iOS开发技巧:使用ObjectiveC创建UUID的代码
    Java获取当前路径
    Oracle 10g 一些事项
    windows 2003 下IIS没有ASP.NET 1.1.4322选项卡
    Windows下手动完全卸载Oracle
    C#如何检测网络端口连接的状态
    windows 2003 下oracle从10.2.0.1升级到10.2.0.4
    Oracle 获取当前日期及日期格式
    Retrieving COM for CLSID {0002450000000000C000000000000046} 80040154.
  • 原文地址:https://www.cnblogs.com/djtang/p/14078444.html
Copyright © 2020-2023  润新知