vue中简单的组件传值

对上一篇TodoList做了改进,在点击li后删除该选项
涉及到vue中父子组件传值


todolist演示.gif
<div id="app">
        <div>
            <input type="text" v-model="inputValue">
            <button @click="btnClick">提交</button>
            <ul>
                <!-- list中每多一个item 就会多显示todo-item的组件 -->
                <!-- 父组件和子组件通信 -->
                <!-- 表示在循环list时,获得的每一个item都绑定到content中 -->
                <!-- 监听到delete事件时 触发父组件中handleItemDelete方法 -->
                <todo-item v-bind:content="item" v-bind:index="index" v-for="(item,index) in list" @delete="handleItemDelete">
                </todo-item>
            </ul>
        </div>
    </div>
    <script>
        // 2.vue创建局部组件 配合注册
        var TodoItem = {
            // 父组件向子组件传值 通过props接收
            props: ['content', 'index'],
            template: "<li @click='handleItemClick'>{{content}}</li>",
            methods: {
                handleItemClick: function() {
                    // 子组件向父组件传值 
                    //使用emit向外触发delete事件 带着index参数
                    this.$emit("delete", this.index);
                }
            }
        }

        var vm = new Vue({
            el: '#app',
            data: {
                list: [],
                inputValue: ''
            },
            // 将组件注册到实例中 原来叫TodoItem,在实例里还是叫TodoItem
            components: {
                TodoItem: TodoItem
            },
            methods: {
                btnClick: function() {
                    this.list.push(this.inputValue);
                    this.inputValue = " ";
                },
                handleItemDelete: function(index) {
                    // 删除list中对应index的值
                    this.list.splice(index, 1);
                }
            }
        });
    </script>

父子组件通信方式

父->子
循环遍历list,得到的每个item和index都通过v-bind绑定到content属性和index属性中。

<todo-item 
           v-bind:content="item" 
           v-bind:index="index" 
           v-for="(item,index) in list" 
           @delete="handleItemDelete">
</todo-item>

在子组件中通过props接收传递的content和index属性。

var TodoItem = {
            // 父组件向子组件传值 通过props接收
            props: ['content', 'index'],
            ....

在list改变时,通过父组件向子组件传值,显示<li>标签。

子->父
删除点击后的<li>,此时需要子组件告诉父组件index是多少,方便父组件更改list列表。
例如,点击<li>apple</li>后apple将被删除,在li中绑定handleItemClick函数,在子组件的methods中声明,使用this.$emit("delete",this.index)向外触发delete事件,同事携带index参数。
同时组件监听到delete事件时,触发父组件中handleItemDelete方法

todo-item v-bind:content="item" v-bind:index="index" v-for="(item,index) in list" @delete="handleItemDelete">

需要在父组件中声明handleItemDelete方法

handleItemDelete: function(index) {
      // 删除list中对应index的值
      this.list.splice(index, 1);
 }

总结

在父组件向子组件传值时,需要使用v-bind绑定属性,子组件通过props接收。
在子组件向父组件传值时,需要使用this.emit()向外触发事件,监听到事件后触发父组件的方法。(监听是桥梁)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容