02慕课网《vue.js2.5入门》——Vue中的组件,实现todolist

TodoList功能开发

例子:输入字符,在列表中显示;

由于有v-for属性,<li>不会被渲染,它已经和数据绑定在一起,有数据来决定

input和button上都有事件监听器,input是通过v-model对数据进行双向绑定;button是监听click事件绑定

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

无数据时:

 

有数据时:

     

 

 

TodoList中组件拆分

组件:页面上的某一部分,将大型网页拆分成几个部分

定义组件:

全局:Vue.component('todo-list(组件名称)',{   });只用组件<todo-list></todo-list>

局部:定义var+声明componts

组件之间的通信:父子组件之间

 

 组件实现的例子:将<li>标签拆成一个组件

(item,index) of list;固定写法 (内容,下标) of 数组 ,和item,index名称无关
父组件Vue根实例,通过数据list的改变,调用子组件todo-itemfull,并且通过属性:content 来传值,子组件li标签的渲染任然通过数据list来决定,实现父组件向子组件之间的通信
<body>
<div id="root">
    <div>
        <input v-model="inputValue"/>
        <button @click="handleSubmit">提交</button>
        <ul>
            <!--使用全局组件-->
            <todo-itemfull v-for="(item,index) of list" :key="index" :content="item"></todo-itemfull>

        </ul>
        <ul>
            <!--使用局部组件-->
            <todo-itemonly></todo-itemonly>

        </ul>
    </div>
</div>
<script>
    // 定义全局组件
    Vue.component('todo-itemfull', {
        // 接受名为content的属性
        props:['content'],
        // 组件模板
        template: '<li>{{content}}</li>'
    });
    // 定义局部组件
    var TodoItem = {
        template: '<li>局部组件</li>'
    }
    // vue实例
    new Vue({
        el: "#root",
        data: {
            inputValue: '',
            list: []
        },
        // 声明局部组件
        components: {
            'todo-itemonly': TodoItem
        },
        methods: {
            handleSubmit: function () {
                this.list.push(this.inputValue);
                this.inputValue = '';
            }
        }
    })
</script>

        

组件与实例之间的关系

 每个组件都是Vue的一个实例

Vue项目就是由一个个实例构建成的

每个实例或者组件都有:props、data、template、methods等属性

根实例的模板若没有定义,则挂载点中的内容就是它的模板

 

实现TodoList的删除功能

子组件显示与否,取决于父组件的list;实现子组件向父组件之间的通信

  • 父组件通过属性向子组件传递数据;通过数据渲染子组件的模板,数据list为空时,页面中没有子组件的内容,
  • $emit子组件向外部进行发布delet事件,并且带上参数
  • 父组件在子组件创建时,绑定监听delete事件
  • 监听到子组件的delete删除事件,修改数据list
  • 数据list改变,子组件的渲染内容发生改变
<body>
<div id="root">
    <div>
        <input v-model="inputValue"/>
        <button @click="handleSubmit">提交</button>
        <ul>
            <!--使用全局组件-->
            <todo-itemfull
                    v-for="(item,index) of list"
                    :key="index"
                    :content="item"
                    :index="index"
                    @delete="handleDelete"
            ></todo-itemfull>
        </ul>
    </div>
</div>
<script>
    // 定义全局组件
    Vue.component('todo-itemfull', {
        // 接受名为content的属性
        props: ['content', 'index'],
        // 组件模板
        template: '<li @click="handleClick">{{content}}  {{index}} </li>',
        methods: {
            handleClick: function () {
                // $emit子组件向外部进行发布
                this.$emit('delete', this.index,this.content);
            },
            handleDelete:function(){
                return '子组件方法';
            }
        }
    });
    // vue实例
    new Vue({
        el: "#root",
        data: {
            inputValue: '',
            list: []
        },
        methods: {
            handleSubmit: function () {
                this.list.push(this.inputValue);
                this.inputValue = '';
            },
            handleDelete: function (index,content) {
                alert(content);
                this.list.splice(index);
            }
        }
    })
</script>
</body>

 

posted @ 2018-05-13 14:33  言凡  阅读(493)  评论(0编辑  收藏  举报