zoukankan      html  css  js  c++  java
  • Vue中父子组件通讯——组件todolist

    一、todolist功能开发

    <div id="root">
            <div>
                <input type="text" v-model="inputValue">
                <button @click="handleSubmit">提交</button>
            </div>
            <ul>
                <li v-for="(item, index ) of list" :key="index">{{item}} </li>
            </ul>
        </div>
        <script>
        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue);
                    this.inputValue='';
                }
            }
        })
        </script>
    View Code

    二、todolist组件拆分

    定义组件,组件和组件之间通讯

    1、全局组件

        <div id="root">
            <div>
                <input type="text" v-model="inputValue">
                <button @click="handleSubmit">提交</button>
            </div>
            <ul>
                <todo-item></todo-item>
            </ul>
        </div>
        <script>
    
        Vue.component('todo-item',{
            template:'<li>item</li>'
        })
    ...

    2、局部组件

    要注册,否则会报错:

    vue.js:597 [Vue warn]: Unknown custom element: <todo-item> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

    <!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>Document</title>
        <script src="./vue.js"></script>
    </head>
    <body>
        <div id="root">
            <div>
                <input type="text" v-model="inputValue">
                <button @click="handleSubmit">提交</button>
            </div>
            <ul>
                <todo-item></todo-item>
            </ul>
        </div>
        <script>
        //全局组件
        // Vue.component('todo-item',{
        //     template:'<li>item</li>'
        // })
    
        var TodoItem={
            template:'<li>item</li>'
        }
        new Vue({
            el:"#root",
            components:{
                'todo-item':TodoItem
            },
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue);
                    this.inputValue='';
                }
            }
        })
        </script>
    </body>
    </html>
    View Code

    3、组件传值

    父组件向子组件传值是通过属性的形式。

    <div id="root">
            <div>
                <input type="text" v-model="inputValue">
                <button @click="handleSubmit">提交</button>
            </div>
            <ul>
                <todo-item 
                    v-for="(item ,index) of list"
                    :key="index"
                    :content="item"
                ></todo-item>
            </ul>
        </div>
        <script>
        Vue.component('todo-item',{
            props: ['content'], //接收从外部传递进来的content属性
            template:'<li>{{content}}</li>'
        })
    
        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue);
                    this.inputValue='';
                }
            }
        })
        </script>

    三、组件与实例的关系

    new Vue()实例

    Vue.component是组件

    每一个Vue组件又是一个Vue的实例。

    任何一个vue项目都是由千千万万个vue实例组成的。

    每个vue实例就是一个组件,每个组件也是vue的实例。 

    四、实现todolist的删除功能

    子组件通过发布订阅模式通知父组件。 

    <div id="root">
            <div>
                <input type="text" v-model="inputValue">
                <button @click="handleSubmit">提交</button>
            </div>
            <ul>
                <todo-item 
                    v-for="(item ,index) of list"
                    :key="index"
                    :content="item"
                    :index="index"
                    @delete='handleDelete'
                ></todo-item>
            </ul>
        </div>
        <script>
        Vue.component('todo-item',{
            props: ['content','index'], //接收从外部传递进来的content属性
            template:'<li @click="handleDeleteItem">{{content}}</li>',
            methods:{
                handleDeleteItem:function(){
                    this.$emit('delete',this.index);
                }
            }
        })
    
        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue);
                    this.inputValue='';
                },
                handleDelete:function(index){
                    this.list.splice(index,1);
                }
            }
        })
        </script>

    本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/9061832.html 有问题欢迎与我讨论,共同进步。

  • 相关阅读:
    修复mac os中的home键和end键
    利用numpy实现list降维
    string与StringBuilder的区别
    mysql 版本,mysqlconnectorjava, application.xml 的 driverclassname 的依赖关系
    linux下创建新用户新数据库并远程访问
    谷歌的JS编码规范链接
    sed命令之多行拷贝
    box2dWeb引擎案例
    SQL Server数据库镜像笔记
    团队项目系统设计
  • 原文地址:https://www.cnblogs.com/starof/p/9061832.html
Copyright © 2011-2022 走看看