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中如何解决跨域问题?
(1)开发环境下:
vue-cli 2.0
vue-cli 3.0
devServer.proxy
参考网址: