当前位置: 首页 > Web前端 > vue.js

computed和watch的区别和应用场景是什么?

时间:2023-04-01 11:46:57 vue.js

computed:是一个computed属性,依赖于其他属性值,computed的值被缓存。只有当它所依赖的属性的值发生变化时,才会在下次获取computed的值时重新计算computed的值;watch:more是“观察”的功能,类似于一些数据的监听回调。每当监控到的数据发生变化时,都会执行回调,进行后续操作;应用场景:当我们需要进行数值计算,依赖其他数据时,应该使用computed,因为可以利用computed的缓存特性,避免每次取到一个值都重新计算;当我们需要在数据更改时执行异步或昂贵的操作时,我们应该使用watch,使用watch选项允许我们执行异步操作(访问API),限制我们可以执行的频率,并设置中间状态直到我们得到最后结果。这些是计算属性不能做的事情。在哪个生命周期调用异步请求?可以在created、beforeMount、mounted这三个钩子函数中调用,因为在这三个钩子函数中,已经创建了数据,可以对服务器返回的数据进行赋值。但是我更推荐在created钩子函数中调用异步请求,因为在created钩子函数中调用异步请求有以下好处:可以更快的获取服务器数据,减少页面加载时间;ssr不支持beforeMount和mounted钩子函数,所以把Contributes放在created里保持一致;Vue组件之间有哪些通信方式?Vue组件之间的通信是面试中经常考到的知识点之一。这个问题有点类似于开放式问题。你回答的方法越多,你得到的分数就越多,这表明你对Vue.js的熟练程度更高。Vue组件之间的通信仅指以下三种通信:父子组件通信、代际组件通信、兄弟组件通信。下面我们将分别介绍每种通信方式,并说明该方式适用于哪些类型的组件通信。(1)props/$emit适用于父子组件通信。这种方法是Vue组件的基础。相信大部分同学都听过,这里就不举例了。引用父页面上的组件1、传值给父页面(data)2、监听子页面的事件(@confirm)在子页面1,获取父页面传来的数据exportdefault{props:{data:Object},data(){...},watch:{data(){这。formData={...this.data}},},2.将子页面改变的数据传递给父页面保存callback(data){this.$emit('confirm',data)},(2)ref和$parent/$children适用于父子组件通信ref:如果用在普通DOM元素上,引用指向DOM元素;if在子组件上使用时,引用指向组件实例$parent/$children:访问父/子实例

父组件中的数据{{user}}

父组件button
1.@click="FatherBtn"父组件按钮可以通过this.$children[0]//2获取子组件的数据。@click="handleClick"子组件按钮可以通过this.$parent.user//获取父组件改变父组件的值(3)EventBus($emit/$on)适用于亲子,代际,兄弟组件通信该方法使用一个空的Vue实例作为中央事件总线(eventcenter),用它来触发事件和监听事件,从而实现任意组件之间的通信,包括父子、代际、兄弟组件1.父页面打开子页面Add……openAddDialog(){this.$refs.addDialog.$emit('open')orthis.$refs.editDialog.$emit('open')},2.在子页面{this.id++this.dialogVisible=true})},(4)$attrs/$listeners适用于代际组件通信$attrs:包含parent中没有使用的propsscope识别(和获取)的属性绑定(类和样式除外)。当一个组件没有声明任何props时,所有的父作用域绑定(除了class和style)都会被包含在这里,内部组件可以通过v-bind="$attrs"传递。通常与inheritAttrs选项结合使用。$listeners:包含父作用域中的v-on事件监听器(没有.native装饰器)。可以将v-on="$listeners"传入内部组件代码实例A.vueB.vueC.vue最终A和C之间的通信是通过B实现的,B组件只是作为一个中间枢纽,做一个转折点。通过v-bind绑定$attrs属性,C组件之所以能在C组件中直接触发buttonClick,是因为A组件传下来的props(B组件中的props声明除外)可以直接获取是因为$listeners属性在B组件调用C组件时绑定了v-on(5)provide/inject适用于跨代组件通信。Provider在祖先组件中提供变量,然后通过inject将变量注入到后代组件中。provide/injectAPI主要解决跨层组件之间的通信问题,但其使用场景主要是子组件获取上层组件的状态,跨层之间建立主动提供和依赖注入的关系级组件。(6)Vuex适用于父子、代际、兄弟组件通信。Vuex是专门为Vue.js应用开发的状态管理模型。每个Vuex应用程序的核心都是商店。“商店”基本上是一个容器,其中包含应用程序的大部分状态(state)。Vuex的状态存储是响应式的。当Vue组件从store中读取状态时,如果store中的状态发生变化,相应的组件将相应地高效更新。更改存储中状态的唯一方法是显式提交更改。这使我们能够轻松跟踪每个状态更改。vue-router有几种路由模式?vue-router有3种路由模式:hash、history、abstract,对应源码如下:switch(mode){case'history':this.history=newHTML5History(this,options.base)breakcase'hash':this.history=newHashHistory(this,options.base,this.fallback)breakcase'abstract':this.history=newAbstractHistory(this,options.base)breakdefault:if(process.env.NODE_ENV!=='production'){assert(false,`invalidmode:${mode}`)}}复制代码其中,三种路由模式的描述如下:hash:使用URL哈希值进行路由。支持所有浏览器,包括不支持HTML5HistoryApi的浏览器;history:取决于HTML5HistoryAPI和服务器配置。详情可以查看HTML5History模式;摘要:支持所有的JavaScript运行环境,例如Node.js服务器端。如果未找到浏览器API,路由器将自动强制进入此模式。