Vue 中的组件

作者: Uchen | 来源:发表于2018-12-29 16:35 被阅读1次

Todo list 功能开发


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="root">
        <div>
            <input 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() {
                    // .push 是向 list 添加数据
                    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="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="root">
        <div>
            <input 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'],
            template: '<li>{{content}}</li>'
        })

        //// 局部组件
        //var TodoItem = {
        //    template: '<li>item</li>'            
        //}

        new Vue({
            el: "#root",
            // 注册局部组件到 vue 实例
            //components: {
            //    'todo-item': TodoItem
            //},
            data: {
                inputValue: "",
                list: []
            },
            methods: {
                handleSubmit: function() {
                    // .push 是向 list 添加数据
                    this.list.push(this.inputValue)
                    // 添加完后,输入框清空
                    this.inputValue = ''
                }
            }
        })
    </script>
    
</body>
</html>
  • Vue.component 创建一个组件,它是一个全局组件,在任何模板里面都可以使用。
  • 局部组件通过 var 定义,然后通过 components 来注册局部组件到相应的 vue 实例中。

props 属性的意思是接收最外面传递进来的名为 content 的属性,然后在 template 中直接使用 content 属性

组件与实例的关系


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="root">
        <div>
            <input 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'],
            template: '<li @click="handleClick">{{content}}</li>',
            methods: {
                handleClick: function() {
                    alert('clicked')
                }
            }
        })

        //// 局部组件
        //var TodoItem = {
        //    template: '<li>item</li>'            
        //}

        new Vue({
            el: "#root",
            // 注册局部组件到 vue 实例
            //components: {
            //    'todo-item': TodoItem
            //},
            data: {
                inputValue: "",
                list: []
            },
            methods: {
                handleSubmit: function() {
                    // .push 是向 list 添加数据
                    this.list.push(this.inputValue)
                    // 添加完后,输入框清空
                    this.inputValue = ''
                }
            }
        })
    </script>
    
</body>
</html>

每一个 vue 的组件又是一个 vue 的实例。任何的 vue 项目都是由千千万万个 vue 实例(组件)组成。

在 vue 中父组件向子组件是通过属性(如:props)的方式来进行传递的。

实现删除功能


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="root">
        <div>
            <input 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"  // 订阅 delete 操作
            >
            </todo-item>
        </ul>
    </div>

    <script>
        // 全局组件
        Vue.component('todo-item', {
            props: ['content'],
            template: '<li @click="handleClick">{{content}}</li>',
            methods: {
                handleClick: function() {
                    // 向外触发,发布 'delete' 操作,带上 index 做为参数
                    this.$emit('delete', this.index)
                }
            }
        })

        //// 局部组件
        //var TodoItem = {
        //    template: '<li>item</li>'            
        //}

        new Vue({
            el: "#root",
            // 注册局部组件到 vue 实例
            //components: {
            //    'todo-item': TodoItem
            //},
            data: {
                inputValue: "",
                list: []
            },
            methods: {
                handleSubmit: function() {
                    // .push 是向 list 添加数据
                    this.list.push(this.inputValue)
                    // 添加完后,输入框清空
                    this.inputValue = ''
                },
                handleDelete: function(index) {
                    this.list.splice(index, 1)
                }
            }
        })
    </script>
    
</body>
</html>

当点击子组件元素时,通知父组件删除数据,怎么通知?
可以通过子组件向父组件传递值的形式(发布订阅模式),可以做到删除 todo-item

相关文章

  • Vue.js的组件化思想 —上

    一、Vue中的组件 Vue视图层的灵魂 — 组件化 组件(Component)是 Vue.js 最强大的功能之一...

  • vue 的坑

    记录vue中遇到的坑(不管是组件ele组件还是vue本身)Element 组件中的bug 寻找地址:https:/...

  • vue学习

    vue核心是组件,组件是vue实例,没有el,其他data,computed等等方法都有。组件定义在vue中,用在...

  • vue中的slot插槽的用法

    App.vue作为b.vue的父组件引用子组件 b.vue中的写法

  • Vite按需引入自定义组件unplugin-vue-compon

    unplugin-vue-components插件可以在Vue文件中自动引入组件(包括项目自身的组件和各种组件库中...

  • Vue中多个元素或组件的过渡

    Vue中多个元素的过渡 Vue中多个组件的过渡(通过动态组件实现组件的过渡动画效果)image.png

  • vue父子组件传递数据方法

    标签(空格分隔): vue 父组件向子组件传递数据 Vue中父组件向子组件传递数据用props 举个例子 父组件中...

  • 组件的局部注册

    组件和组件名 在Vue实例中通过Vue.component({/.../})绑定的组件都自动成为全局组件,不管这个...

  • vue父子组件间调用方法

    标签(空格分隔): vue 子组件中 父组件中

  • Vue/组件

    Vue/组件 创建组件 单独声明一个Vue.component,使用只需要在Vue实例下使用定义的组件名在组件中d...

网友评论

    本文标题:Vue 中的组件

    本文链接:https://www.haomeiwen.com/subject/bglplqtx.html