Vue开发实战(03)-组件化开发

这篇具有很好参考价值的文章主要介绍了Vue开发实战(03)-组件化开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对组件功能的封装,可以像搭积木一样开发网页。

Vue官方的示例图对组件化开发的形象展示。左边是一个网页,可以按照功能模块抽象成很多组件,这些组件就像积木一样拼接成网页。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS7Zk8tp-1686298456553)(null)]

1 什么是组件化开发

1.1 浏览器封装好的组件

在页面的源码里写出的button标签,会在前端页面中显示如下样式:

Vue开发实战(03)-组件化开发

这button就是个组件,这样前端页面在显示上会加上边框和鼠标悬停样式,还可使用click事件触发函数等。只不过这是浏览器封装好的组件,编码只需使用如下代码。

<button> 按钮 </button>

1.2 Vue自定义组件

把一个功能的模板(template)封装在一个.vue文件。如下图,把每个组件的逻辑和样式,即JS和CSS封装在一起,方便在项目中复用整个组件:

Vue开发实战(03)-组件化开发

项目有导航、侧边栏、表格、弹窗等组件,并且也会引入Element3组件库。也会定制业务相关组件,最终通过这些组件,积木式搭建页面。

Vue组件化机制很好用,只需在其基础上,掌握和学习组件化在使用上的设计理念,以实现高效的代码复用,开发中把组件分成:

  • 通用型组件
  • 业务型组件

通用型组件就是各大组件库的组件风格,包括按钮、表单、弹窗等通用功能。业务型组件包含业务的交互逻辑,包括购物车、登录注册等,和我们不同的业务强绑定。

设计组件的要点,先选择一个简单的组件。

全局组件
<!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="todoValue"/>
    <button @click="submit">提交</button>
    <ul>
        <!--
            <li v-for="item of list">{{item}}</li>
            -->

        <!-- 这里的 list 代表new Vue.data里的 list -->
        <!-- :就是 v-bind,将值传递给组件 -->
        <todo-item v-for="item of list"
                   :item="item">
        </todo-item>
    </ul>
</div>

<script>
    // 全局组件
    Vue.component('TodoItem', {
        // 通过 :item="item"接收其值
        props: ["item"],
        template: '<li>{{item}}</li>'
    });
    var app = new Vue({
        el: '#app',
        data: {
            list: []
        },
        methods: {
            submit: function () {
                this.list.push(this.todoValue)
                this.todoValue = ''
            }
        }
    })
</script>
</body>
</html>

效果:

Vue开发实战(03)-组件化开发

局部组件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>局部组件</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="app">
    <input type="text" v-model="todoValue"/>
    <button @click="submit">提交</button>
    <ul>
        <todo-item v-for="item of list"
                   :item="item">
        </todo-item>
    </ul>
</div>

<script>
    // 局部组件
    var TodoItem = {
        props: ["item"],
        template: '<li>{{item}}</li>'
    }
    var app = new Vue({
        el: '#app',
        components:{
            TodoItem
        },
        data: {
            list: []
        },
        methods: {
            submit: function () {
                this.list.push(this.todoValue)
                this.todoValue = ''
            }
        }
    })
</script>
</body>
</html>

效果:

Vue开发实战(03)-组件化开发

2 组件间传值

2.1 父组件 -> 子组件

刚才的全局组件案例,其实就包含父组件向子组件传值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TodoList</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <div>
        <input type="text" v-model="todoValue"/>
        <button @click="handleBtnClick">提交</button>
    </div>
    <ul>
<!--        通过 v-bind,将父组件的 item 值传给子组件了-->
        <todo-item :content="item"
                   :index="index"
                   v-for="(item, index) in list"
                   @delete="handleItemDelete">
        </todo-item>
    </ul>
</div>

<script>

    // 定义了一个名为TodoItem的组件
    // new Vue的子组件
    // 在代码中,通过使用</todo-item>标签,用到了该子组件
    var TodoItem = {
        // 该组件接受内容和索引作为属性
        // 并在列表中显示
        props: ['content', 'index'],
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function () {
                this.$emit("delete", this.index);
            }
        }
    }

    // new Vue属于全局组件
    // 在本 demo 中,也属于最外层的父组件
    // 整个root div 区域也就是该父组件的模板
    // 定义了一个名为app的Vue实例
    var app = new Vue({
        el: "#root",
        components: {
            TodoItem: TodoItem
        },
        // 该实例具有
        data: {
            // 一个todoValue数据属性
            todoValue: "",
            // 一个list数组属性
            list: []
        },
        methods: {
            // 当用户点击提交按钮时
            handleBtnClick: function () {
                // 应用程序将todoValue添加到list数组
                this.list.push(this.todoValue)
                // 并将todoValue重置为空字符串
                this.todoValue = ""
            },
            // 当用户单击列表中的项目时
            // 应用程序将该项目从列表中删除
            handleItemDelete: function (index) {
                this.list.splice(index2, 1)
            }
        }
    })
</script>
</body>
</html>

2.2 子组件 -> 父组件

若现在要实现,点击待办项,能将其删除,就涉及子组件传值给父组件了。

先实现一个click功能:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件传值给父组件</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <div>
        <input type="text" v-model="todoValue"/>
        <button @click="handleBtnClick">提交</button>
    </div>
    <ul>
        <!-- 通过 v-bind,将父组件的 item 值传给子组件了-->
        <todo-item :content="item"
                   :index="index"
                   v-for="(item, index) in list"
        >
        </todo-item>
    </ul>
</div>

<script>

    // 定义了一个名为TodoItem的组件,new Vue的子组件
    // 在代码中,通过使用</todo-item>标签,用到了该子组件
    var TodoItem = {
        // 该组件接受内容和索引作为属性
        // 并在列表中显示
        props: ['content', 'index'],
        // v-on:click 简写成 @click
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function () {
                alert("click")
            }
        }
    }

    // new Vue属于全局组件
    // 在本 demo 中,也属于最外层的父组件
    // 整个root div 区域也就是该父组件的模板
    // 定义了一个名为app的Vue实例
    var app = new Vue({
        el: "#root",
        components: {
            TodoItem: TodoItem
        },
        // 该实例具有
        data: {
            // 一个todoValue数据属性
            todoValue: "",
            // 一个list数组属性
            list: []
        },
        methods: {
            // 当用户点击提交按钮时
            handleBtnClick: function () {
                // 应用程序将todoValue添加到list数组
                this.list.push(this.todoValue)
                // 并将todoValue重置为空字符串
                this.todoValue = ""
            }
        }
    })
</script>
</body>
</html>

效果:

Vue开发实战(03)-组件化开发

现在考虑,把子组件数据传递到父组件,由父组件决定子组件到底显示哪些值。

所以要实现删除,就要将子组件内容传给父组件,父组件来改变数据,父组件的数据变化了,子组件的数据自然就会变更。

在Vue.js中,可以通过在子组件中触发一个自定义事件并传递数据来实现将子组件数据传递到父组件。父组件可以监听子组件的自定义事件,并在事件处理程序中接收传递的数据并更新父组件的数据。这样,父组件的数据变化会自动更新子组件的数据,从而实现删除功能。

父组件的数据变化为啥会自动更新子组件的数据

在Vue.js中,当父组件的数据更新时,它会重新渲染所有子组件。这是因为Vue.js使用了响应式数据绑定的机制,当父组件的数据变化时,所有依赖于该数据的子组件都会自动更新。这个机制是通过Vue.js内部实现的虚拟DOM和数据依赖追踪来实现的。因此,当父组件的数据变化时,子组件的数据也会自动更新,从而实现了数据的同步。

那就来发事件吧:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件传值给父组件</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <div>
        <input type="text" v-model="todoValue"/>
        <button @click="handleBtnClick">提交</button>
    </div>
    <ul>
        <!-- 通过 v-bind,将父组件的 item 值传给子组件 -->
        <!-- 在父组件里创建子组件的同时,就能监听子组件发出的事件
                一旦子组件被触发了,就会执行父组件的 handleItemDelete -->
        <todo-item :content="item"
                   :index="index"
                   v-for="(item, index) in list"

                   @delete="handleItemDelete"
        >
        </todo-item>
    </ul>
</div>

<script>

    // 定义了一个名为TodoItem的组件,new Vue的子组件
    // 在代码中,通过使用</todo-item>标签,用到了该子组件
    var TodoItem = {
        // 该组件接受内容和索引作为属性
        // 并在列表中显示
        props: ['content', 'index'],
        // v-on:click 简写成 @click
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function () {
                // alert("JavaEdge 666")
                // 点击子组件时,子组件对外发出事件
                this.$emit("delete")
            }
        }
    }

    // new Vue属于全局组件
    // 在本 demo 中,也属于最外层的父组件
    // 整个root div 区域也就是该父组件的模板
    // 定义了一个名为app的Vue实例
    var app = new Vue({
        el: "#root",
        components: {
            TodoItem: TodoItem
        },
        // 该实例具有
        data: {
            // 一个todoValue数据属性
            todoValue: "",
            // 一个list数组属性
            list: []
        },
        methods: {
            // 当用户点击提交按钮时
            handleBtnClick: function () {
                // 应用程序将todoValue添加到list数组
                this.list.push(this.todoValue)
                // 并将todoValue重置为空字符串
                this.todoValue = ""
            },
            handleItemDelete: function () {
                alert("delete")
            }
        }
    })
</script>
</body>
</html>

效果:

Vue开发实战(03)-组件化开发

看来发出的事件生效了,那么再小改一处,让父组件把元素清空:

handleItemDelete: function () {
    // alert("delete")
    this.list = [];
}

现在,考虑只删除点击的那一项,而不是清空呢?父组件给子组件传个 index,子组件必须接收它:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件传值给父组件</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <div>
        <input type="text" v-model="todoValue"/>
        <button @click="handleBtnClick">提交</button>
    </div>
    <ul>
        <!-- 通过 v-bind,将父组件的 item 值传给子组件 -->
        <!-- 在父组件里创建子组件的同时,就能监听子组件发出的事件
                一旦子组件被触发了,就会执行父组件的 handleItemDelete -->
        <todo-item :content="item"
                   :index="index"
                   v-for="(item, index) in list"
                   @delete="handleItemDelete">
        </todo-item>
    </ul>
</div>

<script>

    // 定义了一个名为TodoItem的组件,new Vue的子组件
    // 在代码中,通过使用</todo-item>标签,用到了该子组件
    var TodoItem = {
        // 该组件接受内容和索引作为属性
        // 并在列表中显示
        props: ['content', 'index'],
        // v-on:click 简写成 @click
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function () {
                // alert("JavaEdge 666")
                // 点击子组件时,子组件对外发出事件
                // this.$emit("delete")
                // 点击子组件时,子组件对外发出事件,还顺带一个参数也发出去,那么监听事件的handleItemDelete就能拿到 index
                this.$emit("delete",this.index)
            }
        }
    }

    // new Vue属于全局组件
    // 在本 demo 中,也属于最外层的父组件
    // 整个root div 区域也就是该父组件的模板
    // 定义了一个名为app的Vue实例
    var app = new Vue({
        el: "#root",
        components: {
            TodoItem: TodoItem
        },
        // 该实例具有
        data: {
            // 一个todoValue数据属性
            todoValue: "",
            // 一个list数组属性
            list: []
        },
        methods: {
            // 当用户点击提交按钮时
            handleBtnClick: function () {
                // 应用程序将todoValue添加到list数组
                this.list.push(this.todoValue)
                // 并将todoValue重置为空字符串
                this.todoValue = ""
            },
            handleItemDelete: function (index) {
                // alert("delete")
                // this.list = [];
                alert(index)
            }
        }
    })
</script>
</body>
</html>

效果:当我点击 index=0 的 java 时,弹窗顺势而出

Vue开发实战(03)-组件化开发

最终实现删除指定项:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件传值给父组件</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <div>
        <input type="text" v-model="todoValue"/>
        <button @click="handleBtnClick">提交</button>
    </div>
    <ul>
        <!-- 通过 v-bind,将父组件的 item 值传给子组件 -->
        <!-- 在父组件里创建子组件的同时,就能监听子组件发出的事件
                一旦子组件被触发了,就会执行父组件的 handleItemDelete -->
        <todo-item :content="item"
                   :index="index"
                   v-for="(item, index) in list"
                   @delete="handleItemDelete">
        </todo-item>
    </ul>
</div>

<script>

    // 定义了一个名为TodoItem的组件,new Vue的子组件
    // 在代码中,通过使用</todo-item>标签,用到了该子组件
    var TodoItem = {
        // 该组件接受内容和索引作为属性
        // 并在列表中显示
        props: ['content', 'index'],
        // v-on:click 简写成 @click
        template: "<li @click='handleItemClick'>{{content}}</li>",
        methods: {
            handleItemClick: function () {
                // alert("JavaEdge 666")
                // 点击子组件时,子组件对外发出事件
                // this.$emit("delete")
                // 点击子组件时,子组件对外发出事件,还顺带一个参数也发出去,那么监听事件的handleItemDelete就能拿到 index
                this.$emit("delete",this.index)
            }
        }
    }

    // new Vue属于全局组件
    // 在本 demo 中,也属于最外层的父组件
    // 整个root div 区域也就是该父组件的模板
    // 定义了一个名为app的Vue实例
    var app = new Vue({
        el: "#root",
        components: {
            TodoItem: TodoItem
        },
        // 该实例具有
        data: {
            // 一个todoValue数据属性
            todoValue: "",
            // 一个list数组属性
            list: []
        },
        methods: {
            // 当用户点击提交按钮时
            handleBtnClick: function () {
                // 应用程序将todoValue添加到list数组
                this.list.push(this.todoValue)
                // 并将todoValue重置为空字符串
                this.todoValue = ""
            },
            handleItemDelete: function (index) {
                // alert("delete")
                // this.list = [];
                // alert(index)
                /**
                 * 这段代码的作用是从列表中删除指定索引的元素:
                 * 1. list是一个列表对象。
                 * 2. splice()是一个JavaScript数组方法,它用于在数组中添加或删除元素
                 *      第一个参数:要删除或添加元素的起始索引
                 *      第二个参数:要删除的元素数量
                 * 3. 因此,这行代码将从list列表中删除指定索引的元素
                 */
                this.list.splice(index, 1)
            }
        }
    })
</script>
</body>
</html>

总结

为精简代码,注意 v-bind:index="index" 可简写成 :index="index"文章来源地址https://www.toymoban.com/news/detail-477849.html

到了这里,关于Vue开发实战(03)-组件化开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 组件化开发

    提示:这里可以添加本文要记录的大概内容: Vue.js 是一种现代化的前端框架,可以用于构建可复用的组件化应用程序。Vue.js 提供了一种基于组件的架构,使得开发人员可以将应用程序分解为多个可重用的组件。 Vue.js 组件是一个可复用的代码模块,可以在 Vue.js 应用程序中使

    2024年02月15日
    浏览(49)
  • 【Vue】Vite 组件化开发

    1. 什么是组件化开发 组件化开发指的是:根据封装的思想,把页面上可重用的部分封装为组件,从而方便项目的开发和维护。 例如:https://gitee.com/vdpadmin/variant-form 所展示的效果,就契合了组件化开发的思想。用户可以通过拖拽组件的方式,快速生成一个页面的布局结构。

    2024年02月10日
    浏览(48)
  • 前端工程化实战:React 模块化开发、性能优化和组件化实践

    前端工程化实战是指通过组织工作流程、使用工具和技术来提高前端开发效率和质量的一种方法。常见的前端工程化实践包括模块化开发、自动化构建、代码检查和测试、性能优化等。下面将简要介绍模块化开发、性能优化和组件化实践。 模块化开发 在 React 中实现模块化开

    2023年04月10日
    浏览(72)
  • 【vue2第九章】组件化开发和根组件以及style上的scoped作用

    组件化开发和根组件 什么是组件化开发? 一个页面可以拆分为多个组件,每个组件有自己的 样式,结构,行为 ,组件化开发的好处就是,便于维护,利于重复利用,提升开发的效率。 便于维护 :页面中块出了问题,可以直接去找到这个组件,修改组件的样式逻辑结构。

    2024年02月10日
    浏览(53)
  • Android组件化方案及组件消息总线modular-event实战,渣本Android开发小伙如何一步步成为架构师

    美团外卖团队开发的一款Android路由框架,基于组件化的设计思路。主要提供路由、ServiceLoader两大功能。之前美团技术博客也发表过一篇WMRouter的介绍:《WMRouter:美团外卖Android开源路由框架》。WMRouter提供了实现组件化的两大基础设施框架:路由和组件间接口调用。支持和文

    2024年04月22日
    浏览(51)
  • 低代码开发之vue.draggable的使用(初阶:组件化拖拽生成简单页面)

    效果展示 vue.draggable 安装 使用 vue.draggable 相关属性 事件 Demo完整代码 更多详见draggable官网=https://www.itxst.com/vue-draggable/tutorial.html

    2024年02月19日
    浏览(40)
  • Android组件化架构开发--为什么要使用组件化?组件分层?组件路由的简单实现。

    1.1 单工程项目结构 一般我们都是一个业务建一个包 缺点: 各种业务代码混杂在同一个模块里,开发人员在开发、调测过程的效率越来越低,定位某个业务问题,需要在多个业务代码混合的模块中寻找和跳转。 需要了解各个业务的功能,避免代码的改动影响其它业务的功能

    2024年02月10日
    浏览(64)
  • Vue(组件化编程:非单文件组件、单文件组件)

    传统组件编写:不同的HTML引入不同的样式和行为文件 组件方式编写:组件单独, 复用率高(前提组件拆分十分细致)  理解为封装行为:html,css,js封装在一个文件中 解释模块化和组件化的区别: 组件化 :css,js,html三件套使用在同一部分的代码封装在一个组件中 模块化

    2024年02月01日
    浏览(53)
  • 二、Vue组件化编程

    Vue 中使用组件的三大步骤: 定义组件(创建组件) 注册组件 使用组件(写组件标签) 如何定义一个组件? 使用 Vue.extend(options) 创建,其中 options 和 new Vue(options) 时传入的那个 options 几乎一样,但也有点区别; 区别如下: el 不要写,为什么? ——— 最终所有的组件都要经过一

    2024年02月22日
    浏览(45)
  • VUE3 --->组件化

    目录 vue-cli 1、基于 vue ui 创建 vue 项目  组件库 1.vue 组件库 2.vue 组件库和 bootstrap 的区别 3. 最常用的 vue 组件库 4. Element UI axios 拦截器 1. 回顾:在 vue3 的项目中全局配置 axios 2. 在 vue2 的项目中全局配置 axios 3、拦截器 4. 配置请求拦截器 5、配置响应拦截器 proxy 跨域代理 1. 回

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包