Vue 组件化: 计算属性、内容分发、自定义事件

这篇具有很好参考价值的文章主要介绍了Vue 组件化: 计算属性、内容分发、自定义事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 计算属性

1.1 计算属性的特点

2. 内容分发

2.1 使用插槽的示例

3. 自定义事件


1. 计算属性

什么是计算属性 ?

计算属性的重点突出在属性两字, 首先它是个属性, 其次这个属性有计算的能力, 这里的计算就是个函数; 简单来说, 它就是一个能够将计算结果缓存起来的属性 (将行为转化成了静态的属性), 仅此而已; 可以想象为缓存!

代码示例 : 

<div id="app">
  <p>currentTime1: {{currentTime1()}}</p>
  <p>currentTime2: {{currentTime2}}</p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
          msg: "hello vue"
        },
        methods: {
          currentTime1: function() {
            return Date.now(); // 返回一个时间戳
          }
        },
        computed: { // 计算属性 注意: methods, computed 方法不能重名, 重名之后只会调用 methods 方法
          currentTime2: function() {
            return Date.now();  // 返回一个时间戳
          }
        }
    });
</script>

说明:

  • methods : 定义方法, 调用方法使用 currentTime1(), 需要带括号;
  • computed : 定义计算属性, 调用属性使用 currentTime2, 不需要带括号; 

【注意】methods 和 computed 中的方法不能重名

如果二者方法重名了, 就只会调用到 methods  中的方法.  请看如下示例 : 

Vue 组件化: 计算属性、内容分发、自定义事件

访问页面 : 

 Vue 组件化: 计算属性、内容分发、自定义事件

1.1 计算属性的特点

针对上述代码示例, 对比调用 methods 和 computed 方法的变化 : 

1. 控制台调用 methods 中的方法 : 

每次调用 currentTime1, 时间戳都会发生改变.

Vue 组件化: 计算属性、内容分发、自定义事件

2. 控制台调用 computed 中的方法 : 

每次调用 currentTime2, 时间戳不会发生变化. 计算出来的结果被缓存在内存中了.

Vue 组件化: 计算属性、内容分发、自定义事件

【注意变化】

此时我在 computed 中调用一下 data 中的 msg 数据, 并在控制台中不断调用 computed 中的currentTime2 过程中, 突然修改一下 msg 的值, 再去调用 currentTime2, 此时观察变化 :

Vue 组件化: 计算属性、内容分发、自定义事件

当 computed 中其他数据刷新时, currentTime2 的时间戳就会重新计算, 这个和缓存一模一样. 

【结论】

调用方法时, 每次都需要进行计算, 既然有计算过程则必定产生系统开销, 那如果这个结果是不经常变化的的呢 ? 此时就可以考虑将这个结果缓存起来, 采用计算属性可以很方便的做到这一点, 计算属性的主要特征就是为了将经常变化的计算结果进行缓存, 以节约我们的系统开销; 

2. 内容分发

在 Vue.js 中我们使用 <slot> 元素作为承载分发内容的出口, 作者称其为 "插槽", 可以应用在组合组件的场景中.

为什么需要插槽 ? 比如当我们遇到以下场景时 : 

<div id="app">
    <p>列表书籍</p>
    <ul>
        <li>Java</li>
        <li>Linux</li>
        <li>Python</li>
    </ul>
</div>

按照原先的方式, 我们想要拿到 li 中的所有数据, 就得遍历 ul, 可现在 ul 里面隔了 li , 此时再按照之前的方式遍历就会出问题, 于是就需要使用到 "插槽" 来解决

2.1 使用插槽的示例

准备一个待办事项组件 (todo), 该组件由待办标题 (todo-title) 和待办内容 (todo-items) 组成, 但是这三个组件又是互相独立的, 如何使用插槽来实现 ??

1. 定义一个待办事项的组件 : 

<div id="app">
    <todo>
    </todo>
</div>

<script>
    Vue.component("todo",{
        template: '<div>\
                        <div>列表书籍</div>\
                        <ul>\
                            <li>Java</li>\
                        </ul>\
                    </div>'
    });
</script>

2. 让待办事项的标题和值实现动态绑定. 我们给上面的待办事项的标题和值都留出一个插槽.  <slot> 标签

<div id="app">
    <todo>
    </todo>
</div>

<script>
    Vue.component("todo",{
        template: '<div>\
                        <slot name="todo-title"></slot>\
                        <ul>\
                            <slot name="todo-items"></slot>\
                        </ul>\
                    </div>'
    });
</script>

3. 定义 todo-title 的待办标题组件和 todo-items 的待办内容组件.

// 待办标题组件
Vue.component("todo-title",{
    props: ['title'],
    template: '<div>{{title}}</div>'
});
// 待办内容组件
Vue.component("todo-items",{
    props: ['item','index'],
    template: '<li>{{index}}--{{item}}</li>'
});

4. 实例化 Vue, 并初始化数据

var vm = new Vue({
    el: "#app",
    data: {
        title: "跟秦老师学 Vue",
        todoItems: ['你好世界','毛毛学hadoop','毛毛学Linux']
    }

});

5. 将这些值通过插槽插入, 实现组合组件的内容分发.

<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems" 
            :item="item" :index="index"></todo-items>
    </todo>
</div>

浏览器访问 : 

Vue 组件化: 计算属性、内容分发、自定义事件

 由此可见, 插槽在组合组件中实现内容分发起了关键作用. 

3. 自定义事件

既然 Vue 它是双向绑定的, 那我们如何针对上述内容分发的示例, 实现动态的删除呢 ??

Vue 组件化: 计算属性、内容分发、自定义事件

 分别在 todo-items 组件和 vm 实例中增加删除方法 : 

Vue.component("todo-items",{
    props: ['item','index'],
    // 只能绑定当前组件的方法
    template: '<li>{{index}}---{{item}} <button @click="remove">删除</button></li>',
    methods: {
        remove: function() {
            alert("删除成功!");
        }
    }
});

var vm = new Vue({
    el: "#app",
    data: {
        title: "秦老师说 Vue",
        todoItems: ['你好世界','毛毛学hadoop','毛毛学Linux']
    },
    methods: {
        removeItems: function (index) {
            this.todoItems.splice(index,1);
        }
    }
});

       但是现在问题是, todo-items 组件中无法绑定 vue 实例中的方法, 一旦我把 @click="remove" 写成 @click="removeItems", 访问页面的时候, 就会报 removeItems 未定义的错误.  

      于是 Vue 就为我们提供了自定义事件的功能帮助我们解决这个问题 , 

使用 this.$emit("自定义事件名", 参数), 具体操作如下 : 

1. View 层模板绑定 Vue 实例中的方法

<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems" 
            :item="item" :index="index" v-on:remove="removeItems(index)"></todo-items>
    </todo>
</div>

2. todo-Items 组件中使用 this.$emit() 绑定 view 模板中的自定义事件

Vue.component("todo-items",{
    props: ['item','index'],
    // 只能绑定当前组件的方法
    template: '<li>{{index}}---{{item}} <button @click="remove">删除</button></li>',
    methods: {
        // this.$emit 自定义事件分发
        remove: function(index) {
            this.$emit('remove',index);
        }
    }
});

此时就能动态的对数据进行删除了.

自定义事件原理图 : 

Vue 组件化: 计算属性、内容分发、自定义事件文章来源地址https://www.toymoban.com/news/detail-477921.html


到了这里,关于Vue 组件化: 计算属性、内容分发、自定义事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 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日
    浏览(36)
  • 【Vue】Vite 组件化开发

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

    2024年02月10日
    浏览(48)
  • 通用vue组件化登录页面

    1.首先建立一个login文件夹,在里面建立对应的login.vue文件 2.设置登录页面的背景图,在App.vue文件中使用router-view进行展示登录组件 3.先给App.vue的div元素设置高度100%,之后在login.vue里面去设置背景图 这里注意怎么使login组件垂直水平居中的样式 1.首先建立一个cpns的文件夹,里

    2024年02月09日
    浏览(43)
  • Vue 如何简单快速组件化

    为了简化拆分复杂的代码逻辑,和实现代码的组件化,封闭化。我们需要使用组件化的方法。我这里只讲解我感觉最优的组件化方法。 vue组件化总结 vue 单文件组件 子组件修改Props报错 vue 父组件调用子组件方法ref vue中组件的props属性(详) 使用Vue-cil搭建一个简单的Vue页面,

    2024年02月12日
    浏览(39)
  • Vue开发实战(03)-组件化开发

    对组件功能的封装,可以像搭积木一样开发网页。 Vue官方的示例图对组件化开发的形象展示。左边是一个网页,可以按照功能模块抽象成很多组件,这些组件就像积木一样拼接成网页。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS7Zk8tp-16862

    2024年02月08日
    浏览(99)
  • 通用vue组件化展示列表数据

    1.首先先确定要展示的表格列名以及拿到所需要展示的数组数据 2.然后建立一个专门放el-table遍历的文件 3.在父组件中将数据列表数据存放在listData里面,然后传给子组件,子组件定义一个动态的列,通过遍历propList得到列名,然后也动态匹配prop,这样prop的值会去和listData进行匹

    2023年04月08日
    浏览(36)
  • vue~el-autocomplete实现组件化

    可以实现异步的数据拉取,从异步返回的数据中,选择需要的结果,并回显到文本框中。 回调列表,异步的方式获取数据列表,显示在列表框中 当选中某一项时,会触发这个方法,将数据获取到,这时,我们可以将数据回显,或者赋值给父页面上的元素,如果希望赋值父页

    2024年02月11日
    浏览(42)
  • Vue学习Day3——生命周期\组件化

    Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 4.销毁阶段:销毁Vue实例 Vue生命周期过程中,会 自动运行一些函数 ,被称

    2024年02月15日
    浏览(47)
  • 【vue3】10-vue组件化额外知识补充(下)-动态组件-组件缓存-v-model在组件上的应用

    切换组件案例: 比如我们现在想要实现了一个功能: 点击一个tab-bar,切换不同的组件显示; 这个案例我们可以通过两种不同的实现思路来实现: 方式一 :通过v-if来判断,显示不同的组件; 方式二 :动态组件的方式; 方式一代码示例: 动态组件方式实现 动态组件是使用 component组

    2024年02月08日
    浏览(68)
  • Vue:将以往的JQ页面,重构成Vue组件页面的大致思路梳理(组件化编码大致流程)

    组件要按照功能点拆分,命名不要与 HTML元 素冲突。 1、根据 UI 提供的原型图,进行结构设计,结构设计的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、设计好结构后,开始写对应的组件,并根据梳理好的层级关系,对应引入组件。 3、根据

    2024年01月15日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包