Vue.js常见问题

v-show与v-if的区别

1.v-show只是css级别的display属性none和block之间的切换。而v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建

2.v-show一般用在操作比较频繁的地方,v-if用在运行时条件很少改变的地方。

3.v-if="false"时,内部组件不会渲染,可以利用这个合理渲染重要的内容。或者和v-else,v-else-if一起使用。

 

定class的数组用法

一般绑定class对象的用法如下

<div v-bind:class="{ active: isActive }"></div>

当isActive为true时,class="active"

你可以在对象中传入更多属性来动态切换多个 class,v-bind:class可以和普通的class共存

<div 

class=”static“

v-bind:class="{ active: isActive,text-danger:hasError }">

</div>

data{

isActive:true,

hasError:false

}

那渲染结果为<div class="static active"></div>

数组的用法

<div v-bind:class="[ activeClass,errorClass ]"></div>

data{

activeClass:'active',

errorClass:'text-danger'

}

渲染为

<div class="active text-danger">

想根据条件切换数组中的class

可以用三元表达式:

<div v-bind:class=[isActive?activeClass:'',errorClass]>

这样会始终添加errorClass,只有当isActive为true时添加activeClass

在数组语法中也可以使用对象语法:

<div v-bind:class=[{active:isActive},errorClass]>

 

计算属性和watch的区别

计算属性是自动监听,依赖值的变化,从而动态返回内容。

如果我们还需要动态值,那就用计算属性;需要知道值改变之后执行的逻辑,就用watch

补充:

1.computed是一个对象的时候,有get和set两个选项。

2.methons是一个方法,可以接受参数,computed可以缓存。

3.computed可以依赖其他的computed,甚至是其他组件的data。

4.watch是一个对象的时候,有handler(执行的函数),deep(是否深度),immediate(是否立即执行)等常用选项。

事件修饰符

<!--ctrl按下时触发,即使Alt或Shift被一同按下也会触发-->

<button @click.ctrl="onClick">B</button>

<!-- 有且只有ctrl被按下时触发-->

<button @click.ctrl.exact="onClick">B</button>

<!-- 没有任何修饰符被按下时触发-->

<button @click.exact="onClick">B</button>

 

<!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form>

 

<!-- 添加事件监听器时使用事件捕获模式 --> <!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 --> <div v-on:click.capture="doThis">...</div>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div>

 

<!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a>

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 --> <!-- 而不会等待 `onScroll` 完成 --> <!-- 这其中包含 `event.preventDefault()` 的情况 --> <div v-on:scroll.passive="onScroll">...</div>

 

组件中的data为什么是函数

因为组件使用来复用的,JS里对象是引用关系,这样作用域没有隔离

而new Vue的实例是不会被复用的,因此不存在引用对象的问题。

Keep-alive内置组件


Props:

1.include 字符串或正则表达式,匹配的组件会被缓存

2.exclude 与上面相反

3.max。数字,最大可以缓存多少组件实例。

用法:

<keep-alive>包裹动态组件时,会缓存不活动的组件实例,而不是销毁他们,和<transition>一样,它是一个抽象组件,不会渲染出一个DOM元素,也不会出现在父组件链中。

当组件在<keep-alive>内被切换,它的activated和 deactivate 这两个生命周期钩子函数将会被对应执行。

主要用于保留组件状态或避免重新渲染。

<!-- 基本 -->

<keep-alive> <component :is="view"></component> </keep-alive>

<!-- 多个条件判断的子组件 -->

<keep-alive> <comp-a v-if="a > 1"></comp-a> <comp-b v-else></comp-b> </keep-alive>

<!-- 和 `<transition>` 一起使用 -->

<transition> <keep-alive> <component :is="view"></component> </keep-alive> </transition>

注意:<keep-alive>是用在其一个直属的子组件被开关的情形。如果你在其中有v-for则不会工作。如果有上述的多个条件性的子元素,<keep-alive>要求同时只有一个子元素被渲染。

Vuex中mutations和actions的区别

actions可以执行异步,actions调用mutations,而mutations来修改store。

Render函数

类型:(createElement: () => VNode) => VNode

详细:字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode。如果组件是一个函数组件,渲染函数还会接收一个额外的 context 参数,为没有实例的函数组件提供上下文信息。

怎么理解单向数据流

父组件时通过prop把数据传递到子组件的,但是这个prop只能由父组件修改,子组件修改会报错。子组件想修改时,只能通过$emit派发一个自定义事件,父组件接到后,由父组件修改。

生命周期

主要有8个阶段

①beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

②created:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

③beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。该钩子在服务器端渲染期间不被调用。

④mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted:mounted: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) } 该钩子在服务器端渲染期间不被调用。

⑤beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。

⑥updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。

注意 updated 不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用 vm.$nextTick 替换掉 updated:updated: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been re-rendered }) }该钩子在服务器端渲染期间不被调用。

⑦beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。该钩子在服务器端渲染期间不被调用。

⑧Destoryed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

组件间的通信

1.父向子传递数据是通过props,子向父通过events(emits)

2.通过父链子链也可以(parent/$children)

3.ref也可以访问组件实例,provide/inject API

4.兄弟通信通过Bus和Vuex

5.跨级通信通过Bus和Vuex 和provide/inject API

路由的跳转方式

1.通过<router-link to="home">,router-linker标签渲染为<a>标签,在template中的跳转都是用这种。

2.另一种是边城式导航,也就是通过JS跳转,比如router.push('/home')。

Vue.js 2.x 双向绑定原理

核心的API是通过Object.defineProperty()来劫持各个属性的setter/getter,在数据变动时发布消息给订阅者,触发相应的监听回调,这就是为什么不支持IE8的原因。

MVVM与MVC有什么区别

MVVM模式是由经典的软件架构MVC衍生来的。当View(视图层)变化时,会自动更新到ViewModel(视图模型)。反之亦然。View和ViewModel之间通过双向绑定(data-binding)建立联系,于MVC不同的是,他没有Controller层,而是演变为ViewModel。

ViewModel通过双向绑定数据把View层和Model层连接起来,而View和Model之间的同步工作是由Vue.js完成的,我们不需要手动操作DOM,只需要维护好数据状态。

猜你喜欢

转载自www.cnblogs.com/yuyezhizhi/p/10910581.html