相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
?点赞?收藏?不迷路!?
Vue.js是一款用于构建用户界面的渐进式JavaScript框架。其基本原理包括:
v-bind
、v-model
、v-if
、v-for
等。双向数据绑定是指视图层的变化会自动同步到数据层,反之亦然。在Vue中,双向数据绑定是通过v-model
指令来实现的。其基本原理如下:
v-model
时,Vue会为该元素绑定input事件监听器。当用户输入时,触发input事件,通过事件监听器更新数据,反之亦然。使用Object.defineProperty()
进行数据劫持有一些缺点:
Object.defineProperty()
只能劫持对象的属性,而不是整个对象。因此,需要逐个定义对象的每个属性,如果对象的嵌套层级很深,需要递归定义,增加了代码复杂性。Object.defineProperty()
时,被劫持的属性必须是对象,初始值不能是基本类型。如果初始值是基本类型,需要额外处理。Object.defineProperty()
无法直接监听数组的变化,因为数组的一些操作(例如通过索引直接设置元素值)不会触发setter。Object.defineProperty()
可能会带来性能开销,因为每个属性的变化都会触发相应的getter和setter。这三个是设计模式,用于组织前端应用的代码结构,其中MVVM、MVC、MVP分别代表:
Model
表示数据和业务逻辑,View
表示用户界面,ViewModel
充当View和Model之间的中介,处理View的用户输入,并更新Model。Vue.js是一个典型的MVVM框架。Model
表示数据和业务逻辑,View
表示用户界面,Controller
处理用户输入并更新Model和View。AngularJS是一个使用MVC模式的框架。Model
表示数据和业务逻辑,View
表示用户界面,Presenter
处理用户输入并更新Model和View。React框架通常被认为是一个采用了MVP模式的库。区别主要在于各个组件之间的交互方式和关注点分离程度。
在Vue中,computed
和watch
都是用于观察数据变化的工具,但它们之间有一些关键的区别:
Computed: computed
是用于声明派生状态的属性,它依赖于其他响应式数据,只有在相关依赖发生变化时才会重新计算。computed
的值会被缓存,只有当依赖改变时才会重新计算。通常用于处理一些基于状态的复杂计算。
<template>
<div>{{ fullName }}</div>
</template>
<script>
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe',
};
},
computed: {
fullName() {
return `${this.firstName} ${this.lastName}`;
},
},
};
</script>
- Watch: watch用于观察特定数据的变化并执行副作用,可以在数据变化时执行异步或复杂操作。watch 更灵活,但可能需要手动处理一些逻辑,例如处理异步请求。
<template>
<>
在Vue中,computed
和methods
都用于处理逻辑,但它们有几个关键的区别:
computed
)是基于它的依赖缓存的。只有相关依赖发生改变时,计算属性的值才会重新计算,而之后的访问会直接返回缓存的结果。methods
)每次被调用时都会执行函数体,不会缓存结果。<template>
<div>
<p>Computed Property: {{ computedProperty }}</p>
<p>Method: {{ methodResult() }}</p>
</div>
</template>
<script>
export default {
data() {
return {
dataValue: 5,
};
},
computed: {
computedProperty() {
return this.dataValue * 2;
},
},
methods: {
methodResult() {
return this.dataValue * 2;
},
},
};
</script>
Slot(插槽) 是Vue.js中一种机制,用于在组件的模板中扩展子组件的内容。它允许父组件将任意内容插入子组件中的特定位置。
作用:
原理:
默认插槽:如果子组件没有具名插槽,父组件传递的内容将被插入子组件中<slot>
标签的位置。
<!-- 子组件 -->
<template>
<div>
<slot></slot>
</div>
</template>
<!-- 父组件 -->
<template>
<child-component>
<p>Hello from parent!</p>
</child-component>
</template>
具名插槽:父组件可以使用<slot>
元素的name
属性定义具名插槽,子组件通过<slot>
元素的name
属性匹配插槽。
<!-- 子组件 -->
<template>
<div>
<slot name="header"></slot>
<div>Other content...</div>
<slot name="footer"></slot>
</div>
</template>
<!-- 父组件 -->
<template>
<child-component>
<template v-slot:header>
<p>Header content</p>
</template>
<template v-slot:footer>
<p>Footer content</p>
</template>
</child-component>
</template>
过滤器的作用:
过滤器用于在模板中对数据进行格式化处理,常见的场景包括文本格式化、日期格式化等。它可以在模板表达式中使用,以管道符(|
)的形式应用在数据上。
如何实现一个过滤器:
在Vue中,可以通过Vue.filter
方法全局注册过滤器,也可以在组件内部通过filters
选项注册局部过滤器。
<template>
<div>
<p>{{ message | capitalize }}</p>
<p>{{ currentDate | formatDate }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'hello world',
currentDate: new Date(),
};
},
filters: {
capitalize(value) {
if (!value) return '';
return value.charAt(0).toUpperCase() + value.slice(1);
},
formatDate(value) {
if (!value) return '';
const options = { year: 'numeric', month: 'long', day: 'numeric' };
return new Date(value).toLocaleDateString('en-US', options);
},
},
};
</script>
在上述例子中,capitalize
和formatDate
就是两个过滤器,分别用于将字符串首字母大写和格式化日期。
保存页面的当前状态通常有以下几种方式:
localStorage
或sessionStorage
将页面状态存储在客户端,以便在刷新后重新加载。具体选择哪种方式取决于应用的需求和复杂性。
Vue.js是一个流行的JavaScript框架,它提供了一些方便的事件修饰符来处理用户交互。下面是一些常见的事件修饰符及其作用:
.stop
:阻止事件冒泡,即阻止事件向父元素传播。.prevent
:阻止事件的默认行为,比如阻止表单提交或者超链接的跳转。.capture
:使用事件捕获模式,而不是默认的事件冒泡模式。.self
:只在事件触发的元素自身上触发事件,而不是其子元素。.once
:事件只会触发一次,之后会自动移除事件监听器。.passive
:告诉浏览器该事件监听器不会调用preventDefault()
,可以提高滚动性能。.native
:监听组件根元素的原生事件,而不是组件内部的自定义事件。.left
:只在鼠标左键点击时触发事件。.right
:只在鼠标右键点击时触发事件。.middle
:只在鼠标中键点击时触发事件。开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
已 300 + Star!
?点赞?收藏?不迷路!?