Vue - 1.组件的创建和通信

223 阅读2分钟

局部组件 和 全局组件的创建和使用

  • 全局组件创建: Vue.component('组件名', {})

  • 局部组件创建: const 组件名 = {}

  • 在组件中,data 必须是一个函数,return 一个对象

  • 挂载子组件用 components

<body>
    <div id="app">
        <!--使用子组件 -->
        <App></App>
    </div>

    <script src="./vue.js"></script>
    <script>
        //创建全局组件
        Vue.component('Vheader', {
            template: `
                <div>
                    <h3>我是一个头部组件</h3>
                </div>
            `
        })
        //创建子组件
        const Vcontent = {
            data() {
                return {
                }
            },
            template: `
                <div>
                    <h3>我是内容组件</h3>
                </div>
            `
        }
        const App = {
            data() {
                return {
                    msg: '我是App组件'
                }
            },
            //挂载子组件
            components: {
                Vcontent,
            },
            template: `
                <div>
                    <h3>{{msg}}</h3>
                    <button @click='handleClick'>按钮</button>
                    <!--使用子组件-->
                    <Vheader></Vheader>
                    <Vcontent></Vcontent>
                </div>
            `,
            methods: {
                handleClick() {
                    this.msg = '学习局部组件'
                }
            }
        }
        new Vue({
            el: '#app',
            data: {
            },
            components: {
                //挂载子组件
                App,
            }
        })
    </script>
</body>

组件通信

父传子:通过props属性来进行通信

  1. 在子组件中声明props接收在父组件中挂载的属性

  2. 可以在子组件中的templata中任意使用

  3. 在父组件绑定自定义的属性

Vue.component('Child', {
    template: `
        <div>
            <h3>我是子组件</h3>
            <h4>{{childData}}</h4>//4.使用自定义属性插值
        </div>
	`,
    props: ['childData']//3.props属性内接收父组件内自定义属性
})
const App = {
    data() {
        return {
            msg: '我是父组件传进来的值' //1.父组件属性
        }
    },
    template: `
	    <div>
    		<Child :childData='msg'></Child> //2.通过给子组件标签绑定自定义属性来传递msg
    	</div>
    `,
}

子传父:通过this.$emit触发自定义事件

  1. 在父组件插入的子组件标签内绑定自定义事件
  2. 在子组件中触发原生的事件
  3. 在事件函数中通过 this.$emit 触发自定义事件
Vue.component('Child', {
    template: `
        <div>
            <h3>我是子组件</h3>
            <!-- 1.绑定input事件,并插入子组件方法获得input的传值 -->
            <input type="text" @input = 'handleInput' />
        </div>
    `,
    methods: {
        handleInput(e) {
            const newVal = e.target.value;//2.接收传入的值并赋值给newVal
            this.$emit('fatherHandler', newVal);//3.通过this.$emit触发父组件内子组件标签上的fatherHandler自定义事件,并将newVal传递给触发的isInput方法
        }
    }
})
const App = {
    data() {
        return {
            newVal: ''//父组件为接收子组件的传值而声明的属性
        }
    },
    template: `
        <div>
            <div class='father'>
                数据:{{newVal}} //5.插入被赋值的属性
            </div>
            <Child @fatherHandler = 'isInput'></Child>//绑定自定义事件并触发父组件方法
        </div>
    `,
    methods: {
        isInput(newVal) {
            this.newVal = newVal;//4.接收传入子组件数据,并赋值给父组件的属性
        }
    }
}

兄弟组件通信

const bus = new Vue();//0.Vue实例化创建一个bus中央事件总线作为公共对象
Vue.component('B', {
    data() {
        return {
            count: 0
        }
    },
    template: `
	    <div>{{count}}</div>
    `,
    created() {//1.通过created钩子函数,当组件被创建出来后初始化并立即调用内部函数
        //$on绑定事件
        bus.$on('add', (n) => {//2.给bus绑定函数add
            this.count += n;//5.函数被调用并接收参数,赋值给当前组件的count属性
        })
    }
})
Vue.component('A', {
    data() {
        return {
            count: 0
        }
    },
    template: `
        <div>
        	<button @click='handleClick'>+1</button>//3.组件绑定点击事件触发handleClick方法
        </div>
    `,
    methods: {
        handleClick() {
            //$emit触发事件
            bus.$emit('add', 1)//4.方法触发bus内的add函数并传参1
        }
    },
})
const App = {
    template: `
        <div>
            <B></B>
            <A></A>
        </div>
	`,
}

祖父组件传递

provide来提供对象,然后通过inject将需要的对象注入到子组件中

Vue.component('B', {
    inject: ['msg'],//2.通过inject将接收到的对象注入到当前子组件
    template: `
        <div>{{msg}}</div>
    `,
})
Vue.component('A', {
    template: `
        <div>
            <B></B>
        </div>
    `,
})
const App = {
    provide() { //1.provide是个函数,return出对象
        return {
            msg: '祖父组件数据'
        }
    },
    template: `
        <div>
            <A></A>
        </div>
    `,
}
created() {
    console.log(this.$parent.$parent.title);
},