美文网首页
vue单文件父子组件之间的通信

vue单文件父子组件之间的通信

作者: 前端葱叶 | 来源:发表于2019-08-06 10:15 被阅读0次

主要笔记内容:

  • 父组件向子组件传值;
  • 子组件向父组件传值;

一、父组件向子组件传值:

步骤:
1、父组件向下传递数据给子组件时,子组件需要通过props声明注册‘prop’来接受数据;
2、子组件自定义的标签,通过v-bind绑定prop;

demo1:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>demo1</title>
    <style>
        li {
            list-style: none;
        }

        [v-cloak] {
            display: none
        }
    </style>
</head>

<body>
    <div id="app">
        <!--步骤2、子组件通过v-bind绑定prop;  -->
        <data-list v-bind:lists="list"></data-list>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        Vue.component('data-list', {
            // 步骤1、父组件通过props向下传递数据数组list给子组件,子组件需要通过props声明注册‘prop’;(注册的prop可以和数据不同名)
            props: ['lists'],
            template: `
            <div>
              <ul>
                <li v-for="item in lists">{{item}}</li>
              </ul>
            </div>
            `
        })
        var app = new Vue({
            el: "#app",
            data() {
                return {
                    list: ['A', 'B', 'C']
                }
            }
        })

    </script>
</body>

</html>

demo2:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>demo2</title>
    <style>
        li {
            list-style: none;
        }

        [v-cloak] {
            display: none
        }
    </style>
</head>

<body>
    <!-- demo:用组件的方法实现在input中输入内容点击添加按钮可在arr后添加,点击删除可删除内容-->
    <div id="app">
        <data-input></data-input>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        // 父组件
        Vue.component('data-input', {
            data: function () {
                return {
                    inputValue: '',
                    arrs: ['A', 'B', 'C']
                }
            },
            // 2、子组件自定义的标签data-lists,通过v-bind绑定prop;
            template: `
            <div>
               <input v-model="inputValue">
               <button @click="add()">add</button>
               <data-lists v-bind:list="arrs"></data-lists>
            </div>
            `,
            methods: {
                add: function () {
                    console.log("add clcik!");
                    this.arrs.push(this.inputValue)
                    this.inputValue = ''
                }
            }
        })
        // 子组件
        Vue.component('data-lists', {
            // 1、父组件向下传递数据给子组件时,子组件需要通过props声明注册‘prop’来接受数据;
            props: ['list'],
            data() {
                return {
                }
            },
            template: `
            <ul>
                <li v-for="(value,index) in list" v-cloak>
                {{value}}
                <button @click="deleted">deleted</button>
                </li>
            </ul>
            `,
            methods: {
                deleted: function (index) {
                    console.log("deleted!");
                    this.list.splice(index, 1)
                }
            }
        })
        var app = new Vue({
            el: "#app",
            data() {
                return {
                }
            },
            methods: {
            },
        })
        
    </script>
</body>

</html>

书写规范:
①组件名建议使用小写短横线命名:如todo-item、blog-post
②当在组件中使用data属性的时候(除了new Vue外的任何地方),它的值必须是一个返回对象的函数.
作用:每个实例可以维护一份被返回对象的独立拷贝.

//组件名建议使用小写短横线命名:如todo-item、blog-post
Vue.component('组件名',{
//当在组件中使用data属性的时候(除了new Vue外的任何地方),它的值必须是一个返回对象的函数.作用:每个实例可以维护一份被返回对象的独立拷贝.
            props: ['item'],//props可以指定类型 
            data:function(){
                return{
                    ...
                }
            },
            template:`...`
        })

二、子组件向父组件传值

步骤:
1、子组件自定义事件;
2、子组件使用$.emit()触发事件,将事件及参数值其传递给父组件;

方法名推荐以小写短横线命名;
格式:this.$emit('方法名', 要传递的数据);

3、父组件使用$on()监听子组件事件及其事件默认传递过来的参数;
或父组件也可以直接在子组件的自定义标签上使用v-on来监听子组件触发的自定义事件,如下demo1;
demo1:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Vue - 子组件传递数据到父组件</title>

</head>

<body>
    <div id="app">
        <p>{{ total }}</p>
        <!-- 3、父组件使用$on()监听子组件事件;或父组件也可以直接在子组件的自定义标签上使用v-on来监听子组件触发的自定义事件。 -->
        <button-counter v-on:add="addTotal"></button-counter>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        Vue.component('button-counter', {
            template: '<button v-on:click="add">{{ counter }}</button>',
            data: function () {
                return {
                    counter: 0
                }
            },
            methods: {
                // 1、子组件自定义事件;
                add: function () {
                    this.counter += 1
                    // 2、子组件使用$.emit()触发事件;
                    this.$emit('add')
                }
            },
        })

        new Vue({
            el: '#app',
            data: {
                total: 0
            },
            methods: {
                addTotal: function () {
                    this.total += 1
                }
            }
        })
    </script>
</body>

</html>

未完,持续整理中~

相关文章

  • Vue相关知识点

    1、vue父子组件之间的通信 在vue组件通信中其中最常见通信方式就是父子组件之中的通性,而父子组件的设定方式在不...

  • Vue组件通信

    Vue 组件之间的通信,通常我们遇到的都是父子组件之间的通信 一、父子组件传参 子组件定义 Props 属性; 父...

  • vue单文件父子组件之间的通信

    主要笔记内容: 父组件向子组件传值; 子组件向父组件传值; 一、父组件向子组件传值: 步骤:1、父组件向下传递数据...

  • 【Vue2】组件传值的六种方法

    Vue 组件之间的通信大概归类为: 父子组件通信: props/$emit;ref/refs;$attrs / $...

  • Vue 组件 / 通信

    子组件=》父组件 vue的组件之间的通信类似angular的父子层级之间通信,父组件获取子组件数据步骤大概如下: ...

  • 父子通信

    title: 组件内父子小组件之间的通信date: 2017-03-20 vue组件 技术分享 分享组件内父子小组...

  • Vue组件通信

    Vue组件通信 Vue组件关系可分为三大类: 父子组件 兄弟组件 跨级组件, 相应的组件之间的通信也分类三大类: ...

  • Vue组件通信

    总体来说,Vue中组件之间的通信场景如下图: 可以将其分为父子组件通信、兄弟组件通信、跨级组件通信。 1. 自定义...

  • [Vue]组件之间如何通信?

    组件通信可以大致分为两种情况,父子组件之间的通信和非父子组件之间的通信,下面来分别介绍 一、父子组件之间的通信 1...

  • Vue面试考点之组件通信

    一、vue中组件之间存在什么样的关系? 我们可以Vue组件之间的关系为如下两类: 1)父子组件之间通信。 2)非父...

网友评论

      本文标题:vue单文件父子组件之间的通信

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