vue常见问题

283 阅读3分钟

1、观察和响应 Vue 实例上的数据变动

computed:

为避免模板中逻辑计算太复杂,使用计算属性computed;

computed是基于响应式依赖进行缓存的,如果数据没有发生改变,则会立即返回之前的计算结果;

侦听属性watched:

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

computed实时监听数据变化,返回计算值;而watched是监听数据变化,返回执行业务逻辑和异步操作后的结果。

2、为什么vue组件中data是一个函数,而new Vue()实例中,data却可以是一个对象呢?

new Vue()实例是不会被复用的;

组件被复用时,对象为引用类型数据,没有作用域的隔离,所有复用组件的data将会指向同一个地址,数据变化会相互影响,所有通过函数可以返回一个数据的副本,避免相互影响。

3、Vuex中的mutations和actions的区别

mutations是Vuex中更改store中状态值的唯一方法;

mutations中有两个参数,类型和回调函数,回调中state和payload;回调中是更改state状态值的地方。

定义:

increment(state,{payload})

调用:

this.$store.commit("类型",{数据});
this.$store.commit({type:"类型名",数据});
this["路径/类型"]({数据});——mapMutations

为什么mutations必须是一个同步函数?

因为异步会使得调试程序时无法确定获取的状态值是哪个?多个异步执行,无法确定哪一个先执行

actions类似于mutations:

1、actions可以通过提交mutations来改变store中的state值;

2、actions中可以包含异步操作;

actions接收一个与store实例具有相同属性和方法的context对象 context.commit/context.state/context.getters

定义:

incrementActions({commit},{payload})

调用:

this.$store.dispatch("类型",{数据});
this.$store.dispatch({type:"类型名",数据});
this["路径/incrementActions"]({payload})

为什么说context对象不是store实例呢?

context是一个具有与store实例相同的属性和方法的对象。
在store中把所有的状态值都绑定,会使store显得臃肿,vuex允许我们将store划分为多个模块,
context对象既包含局部state,也包含全局state,而store实例则没有局部全局一说

4、组件之间的数据传递

1、通过props向子组件中传递数据

在组件上注册自定义属性v-bind,props来接收

2、通过自定义事件this.$emit("自定义事件名称")传递给父组件

3、插槽

<solt></solt>
render函数中{this.$solts.default}

4、vuex中的全局状态

5、vue的双向数据绑定

view-model model-view 通过数据劫持的方式来进行双向数据绑定 通过object.defineProperty()来实现对属性的劫持,来监听数据的变化

6、webpack

四个核心: 入口:要打包的文件;

出口:打包后文件的名字和输出路径;

loader:将要打包的文件转换为webpack可以直接引用的模块(test,use);

插件:打包优化压缩等等,功能强大;

7、mvvm和mvc

MVVM

model<-->viewModel<-->view

m:model

v:view

vm:viewModel(DOMListenners和dataBindings)

viewModel(DOMListeners)会监测view视图层的dom变化,将其更新至model数据中; viewModel当数据更新时,(dataBindings)会帮我们更新DOM变化

MVC

当view层接收到事件时,通过controller去通知model更新数据,model更新完数据后会显示在view上

8、路由的实现原理

路由:监听url地址的变化;页面跳转不刷新

hash模式: hash常用于锚点实现页面内的导航,改变了url的地址,但是没有刷新页面;

通过hashChange可以监听url地址的变化;

history模式: history可以将用户操作过的页面保存起来,通过pushState()、replaceState()来实现页面的跳转,这两个方法都不会使页面刷新;

通过popState监听url地址变化;

9、vue中如何解决跨域问题?

juejin.cn/post/684490…

(1)开发环境下:

vue-cli 2.0

vue-cli 3.0

devServer.proxy

参考网址:

cli.vuejs.org/zh/config/#…

github.com/chimurai/ht…

(2)生产环境下: