组件传参的几种方式

  • props和$emit父组件向子组件传递数据是通过props传递,子组件传递数据给父组件是通过$emit触发事件传递
  • $parent和$children获取当前组件的父组件和当前组件的子组件,通过事件传递可以进行数据的相互通信
  • $attr和$listeners A->B->C 2.4版本开始提供了$attr和$children 来解决这个这个问题 向下传递所有父级传递过来的数据和事件监听
  • 父组件可以提供provide来提供变量, 然后在组件中通过 inject 来注入变量(官方不推荐在实际业务中使用。但是写组件库时很常用,实际业务中使用在后期迭代中很难找到数据的来源)
  • $refs获取组件实例 通过事件传递数据
  • eventBus 兄弟组件数据传递 这种情况下可以使用事件总线的方式
  • vuex状态管理

mvc与mvvm的区别
mvc 指的是模型 视图 控制器
mvvm 值的是模型 视图 viewmodel (数据的双向绑定)

为什么说data是一个函数
组件中的data写成一个函数,数据以函数的返回值的形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件创建了一个私有数据空间,让每个组件实例维护各自的数据。而单纯的写成对象的形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果

vue的生命周期方法有哪些 一般在哪一步发起请求

  • beforeCreate 在实例初始化之后,数据观测和事件配置之前被调用。在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问
  • created实例已经创建完成之后被调用。在这一步,实例已完成以下配置:数据观测、属性和方法的运算、watch和event事件回调。这里没有$el,如果非要想与Dom进行交互,可以通过vm.$nextTick来访问Dom
  • beforeMount 在挂载开始之前被调用,相关的render函数首次被调用
  • mounted 在挂载完成后发生,在当前阶段真是的Dom挂载完毕,数据完成双向数据绑定,可以访问到Dom节点
  • beforeUpdate 数据更新时调用,发生在虚拟Dom重新渲染和打补丁(patch)之前。可以在这个阶段中进一步更改状态,这不会触发附加的重渲染过程
  • updated 发生在更新完成之后,当前阶段组件Dom已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新,该钩子在服务器端渲染期间不会被调用
  • beforeDestroy 实例销毁之前调用。在这一步,实例仍然可用。我们可以在这是进行善后收尾工作,比如清除定时器。
  • destroyed Vue实例销毁后调用。调用后,vue实例指示的所有东西都会解除绑定,所有的事件监听器都会被移除,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用
  • activated keep-alive 专属,组件被激活时调用
  • deactivated keep-alive专属,组件被销毁时调用

异步请求可以在钩子函数 created beforeMount mounted 中进行异步请求,因为在这三个钩子函数中,data 已经创建,可以将服务端返回的数据进行赋值
如果异步请求不需要依赖Dom推荐在created钩子函数中调用异步请求,在created钩子函数中发起请求有以下优点
1 能更快的获取到服务端数据,减少页面loading事件
2 ssr不支持beforeMount mounted 钩子函数,所以放在created中有助于一致性

v-if 和 v-show 的区别
v-if 在编译过程中会被转化成三元表达式,条件不满足时不渲染此节点
v-show只是在控制的节点的 display:none;

怎么理解vue的单向数据流
数据总是从父组件传到子组件,子组件没有权利修改父组件传过来的数据,只能请求父组件对原始数据进行修改。这样会防止从子组件意外改变父组件的状态,从而导致你的应用的数据流向难以理解
如果是在要改变父组件的props 可以在data中定义一个变量,并用prop的值初始化它 之后用$emit通知父组件去修改