初识 Vue(05)---(组件间传值)

简介: 组件间传值(改进 TodoList)改进 TodoList ,点击那个输出 ,那个输出就会消失步骤一 TodoList 提交 ...

组件间传值(改进 TodoList)

改进 TodoList ,点击那个输出 ,那个输出就会消失

步骤一

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src = './vue.js'></script>
</head>
<body>
    <div id ='app'>
        <input type="text" v-model="inputValue"/>
        <button v-on:click="handleBtnClick">提交</button>
        <todo-item v-bind:content="item" 
            v-for="item in list">
        </todo-item> 
    </div>

    <script>
        var TodoItem = {
            props:['content'],
            template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                    alert("click")
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                }
            }
        })
    </script>
</body>
</html>
      template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                    alert("click")
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                }
            }
        })
    </script>
</body>
</html>

运行:

当点击输出值时,弹出对话框

步骤二

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src = './vue.js'></script>
</head>
<body>
    <div id ='app'>
        <input type="text" v-model="inputValue"/>
        <button v-on:click="handleBtnClick">提交</button>
        <todo-item v-bind:content="item" 
            v-for="item in list"
            @delete="handleItemDelete">
        </todo-item> 
    </div>

    <script>
        var TodoItem = {
            props:['content'],
            template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                   this.$emit("delete",this.index);
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                },
                handleItemDelete:function(){
                 this.list = []
                }
            }
        })
    </script>    
</body>
</html>
   <todo-item v-bind:content="item" 
            v-for="item in list"
            @delete="handleItemDelete">
        </todo-item> 
    </div>

    <script>
        var TodoItem = {
            props:['content'],
            template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                   this.$emit("delete",this.index);
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                },
                handleItemDelete:function(){
                 this.list = []
                }
            }
        })
    </script>    
</body>
</html>

当点击子组件的时候,子组件会向外触发一个“delete”事件,在父组件里创建子组件的同时可以监听“delete”事件,用(v-on)简写 “@”监听“delete”事件,即 @delete="handleItemDelete" ;在父组件的模板中,创建父组件的同时也监听子组件的“delete”事件,一旦“delete”事件被触发时,就会执行父组件当中的 “handleItemDelete”方法,在父组件中定义“handleItemDelete”的方法,即 handleItemDelete:function(){ this.list = []}

输出:

     

当点击时,两个输入元素都被删除掉;当监听到点击事件,就会把 list 清空,导致数据发生变化,循环发生变化,则 todo-item 不存在了(但需要点击那个,那个会消失而不是全部消失)

 

步骤三

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src = './vue.js'></script>
</head>
<body>
    <div id ='app'>
        <input type="text" v-model="inputValue"/>
        <button v-on:click="handleBtnClick">提交</button>
        <todo-item v-bind:content="item" 
                   v-bind:index="index"
                   v-for="item in list"
                   @delete="handleItemDelete">
        </todo-item> 
    </div>

    <script>
        var TodoItem = {
            props:['content','index'],
            template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                    this.$emit("delete",this.index);
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                },
                handleItemDelete:function(index){
                 this.list .splice(index,1)
                }
            }
        })
    </script>
    
</body>
</html>
v-bind:index="index"
                   v-for="item in list"
                   @delete="handleItemDelete">
        </todo-item> 
    </div>

    <script>
        var TodoItem = {
            props:['content','index'],
            template:"<li @click='handleItemClick'>{{content}}</li>",
            methods:{
                handleItemClick:function(){
                    this.$emit("delete",this.index);
                }
            }
        }

        var app = new Vue({
            el: '#app',
            components:{
                TodoItem:TodoItem
            },
            data:{
                list: [],
                inputValue:''
            },
            methods:{
                handleBtnClick:function(){
                    this.list.push(this.inputValue)
                    this.inputValue = ''
                },
                handleItemDelete:function(index){
                 this.list .splice(index,1)
                }
            }
        })
    </script>
    
</body>
</html>

当向父组件传值时,还会多传一个  Index , 即  v-bind:index="index" ,指 todo-item 的下标(第几个 todo-item),还需要接收这个下标,即  props:['content','index'], 会被子组件接收;子组件一旦被点击时,不仅触发 “delete”事件,还把 this.index 作为参数带给父组件,即  this.$emit("delete",this.index);父组件监听 "delete"事件,会执行 "handleItemDelete"方法,会拿到子组件传来的 this.index ;接着从下标开始删除一项即可把该项数据删除,即  this.list .splice(index,1),实现功能!(v-bind 可简写成 “ ”   v-bind:index="index"    相当于 :index="index"  

输出: 

    

点击那个输出,那个输出就会消失

目录
相关文章
|
5天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
45 1
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
146 64
|
16天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
48 1
vue学习第一章
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
41 8
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
2月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
35 1
|
2月前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
36 1
|
2月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。

热门文章

最新文章