vue totolist 案例

一、案例:

    <div id="root">
        <div>
            <input type="text" v-model="inputValue">
            <button @click="handleClick">提交</button>
            <br>
            <ul>
                <li v-for="(item,index) of list" :key="index">
                    {{item}}
                </li>
            </ul>
        </div>
    </div>

    <script>
        new Vue({
            el: "#root",
            data: {
                inutValue: '',
                list: []

            },
            methods: {
                handleClick: function() {
                    this.list.push(this.inputValue);
                    this.inputValue = '';
                }
            }

        })
    </script>

methods 方法里,通过 this.list.push(this.inputValue) 添加输入框里输入的子项,每次输入后,this.inputValue = ''清空掉前面 输入的内容

二、todolist组件拆分

    <div id="root">
        <div>
            <input type="text" v-model="inputValue">
            <button @click="handleClick">提交</button>
            <br>
            <ul>
                <!-- <li v-for="(item,idnex) of list" :key="index">
                    {{item}}
                </li> -->
                <todo-item v-for="(item,index) of list" :key="index" :content="item">
                </todo-item>
            </ul>
        </div>
    </div>

    <script>
        //全局组件
        Vue.component('todo-item', {
            props: ['content'],
            template: '<li>{{content}}</li>'
        })

        new Vue({
            el: "#root",
            data: {
                inputValue: '',
                list: [],

            },
            methods: {
                handleClick: function() {
                    this.list.push(this.inputValue);
                    this.inputValue = '';
                }
            }

        })
    </script>

当然也可 以写成局部组件,如下:

<script>
        //全局组件
        // Vue.component('todo-item', {
        //     props: ['content'],
        //     template: '<li>{{content}}</li>'
        // })

        //局部组件
        var TodoItem = {
            props: ['content'],
            template: '<li>{{content}}</li>'
        }
        new Vue({
            el: "#root",
            components: { //局部组件需此定义
                'todo-item': TodoItem
            },
            data: {
                inputValue: '',
                list: [],

            },
            methods: {
                handleClick: function() {
                    this.list.push(this.inputValue);
                    this.inputValue = '';
                }
            }

        })
    </script>

通过props向子组件传递数据  props: ['content']。

组件即实例,可以添加methods等属性:

//局部组件
        var TodoItem = {
            props: ['content'],
            template: '<li @click="handleClick">{{content}}</li>',
            methods: {
                handleClick: function() {
                    alert("clicked");
                }
            }
        }

三、todolist删除功能

    <div id="root">
        <div>
            <input type="text" v-model="inputValue">
            <button @click="handleClick">提交</button>
            <br>
            <ul>
                <todo-item v-for="(item,index) of list" :key="index" :content="item" :index="index" @delete="handleDelete">
                </todo-item>
            </ul>
        </div>
    </div>

    <script>
        //全局组件
        Vue.component('todo-item', { //子组件
            props: ['content', 'index'],
            template: '<li @click="handleClick">{{content}} --- {{index}}</li>',
            methods: {
                handleClick: function() { //点击子组件触发事件
                    this.$emit('delete', this.index) //emit发布订阅,子组件触发父组件delte
                }

            }
        })


        new Vue({ //父组件模板
            el: "#root",
            data: {
                inputValue: '',
                list: [],

            },
            methods: {
                handleClick: function() {
                    this.list.push(this.inputValue);
                    this.inputValue = '';
                },
                handleDelete: function(index) {
                    // alert(index)
                    this.list.splice(index, 1); //splice方法删除对应下标
                }
            }

        })
    </script>

父组件向子组件传递数据通过 属性的方式,子组件向父组件传递数据通过$emit发布订阅模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值