Vue是前端面试必考内容,首先要保证自己要会使用Vue。本篇是从Vue的基本使用,包括模版(插值,指令)、computed和watch、class和style、条件、循环、事件、表单。相信看过这篇内容的同学,一定会受益匪浅。
一、安装Vue框架
首先需要了解下创建Vue框架项目的工具。是基于Vue.js进行快速开发的标准化工具,它可以帮助我们快速创建Vue项目,并提供了一些常用的插件和工具,例如webpack、babel、eslint等。下面是使用Vue CLI创建Vue项目的步骤:
-
首先需要安装Node.js和npm,可以在官网下载安装包进行安装。
-
打开终端,运行以下命令安装Vue CLI:
npm install -g @vue/cli -
创建一个新的Vue项目,可以使用以下命令:
vue create my-project在执行命令后,会提示选择一些配置选项,例如Babel、ESLint、CSS预处理器等,可以根据需要进行选择,也可以直接按回车键使用默认选项。
-
进入项目目录,运行以下命令启动开发服务器:
cd my-project npm run serve执行完命令后,在浏览器中访问http://localhost:8080即可看到Vue应用的初始页面。
至此,一个基于Vue CLI创建的Vue项目就已经创建完成了。可以在项目中使用Vue组件、路由、状态管理等功能进行开发。
二、指令、插值
1、指令:
在Vue中,指令是一种特殊的属性,以“v-”开头,用于在模板中绑定数据和操作DOM元素。以下是Vue中常用的指令:
- v-model:用于双向数据绑定,将表单元素的值与Vue实例中的数据绑定起来。
- v-bind:用于动态绑定HTML属性,可以绑定任何HTML属性,例如class、style、src等。
- v-if、v-else、v-else-if:用于根据条件动态地显示或隐藏元素。
- v-show:用于根据条件动态地显示或隐藏元素,与v-if不同的是,v-show只是通过CSS控制元素的显示和隐藏。
- v-for:用于循环渲染元素,可以循环渲染数组、对象和数字,可以使用别名和索引。注意:key不能乱写(如random或者index),v-for和v-if不能一起使用。
- v-on:用于绑定事件,可以绑定任何DOM事件,例如click、input、submit等。
- v-text:用于将数据渲染为纯文本,与插值“{{ }}”类似,但是只会渲染纯文本,不会解析HTML标签。
- v-html:用于将数据渲染为HTML代码,可以解析HTML标签。
除了以上常用的指令,Vue还提供了一些其他的指令,例如v-cloak、v-pre、v-once等,开发者可以根据实际需求选择合适的指令来处理模板。
2、插值:
在Vue中,插值是一种将数据渲染到模板中的方式,它使用双大括号“{{}}”包裹表达式,例如“{{message}}”。插值的作用是将数据绑定到模板中,使得数据能够动态地显示在页面上。
插值可以渲染简单的数据类型,例如字符串、数字、布尔值等,也可以渲染复杂的数据类型,例如对象、数组、函数等。在插值中,可以使用JavaScript表达式,例如“{{num1 + num2}}”、“{{message.toUpperCase()}}”等。
插值的另一个重要特性是数据绑定,即当数据发生变化时,插值会自动更新视图。例如,当Vue实例中的数据发生改变时,插值会自动重新渲染模板,从而使得页面上的数据实时更新。
在Vue中,表单的使用与普通的HTML表单类似,但是Vue提供了一些特殊的指令和方法来简化表单的处理。
3、表单:v-model
v-model指令用于实现表单元素与Vue实例中数据的双向绑定。例如,可以使用v-model指令将input元素的值绑定到Vue实例中的一个变量:
<template>
<div>
<input type="text" v-model="message">
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: ''
}
}
}
</script>
在上面的例子中,当用户在input元素中输入内容时,Vue实例中的message变量会自动更新,同时在p元素中显示最新的message值。
v-model指令不仅可以绑定文本框的值,还可以绑定复选框、单选框、下拉框等表单元素的值。例如,可以使用v-model指令将单选框的值绑定到Vue实例中的一个变量:
<template>
<div>
<input type="radio" id="male" value="male" v-model="gender">
<label for="male">Male</label>
<input type="radio" id="female" value="female" v-model="gender">
<label for="female">Female</label>
<p>{{ gender }}</p>
</div>
</template>
<script>
export default {
data() {
return {
gender: ''
}
}
}
</script>
在上面的例子中,当用户选择单选框时,Vue实例中的gender变量会自动更新,同时在p元素中显示最新的gender值。
- 表单提交
在Vue中,可以使用v-on指令绑定表单的submit事件,从而实现表单的提交。例如,可以使用v-on指令绑定submit事件,然后在Vue实例中处理表单的提交:
<template>
<div>
<form v-on:submit.prevent="submitForm">
<input type="text" v-model="username">
<input type="password" v-model="password">
<button type="submit">Submit</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
username: '',
password: ''
}
},
methods: {
submitForm() {
// 处理表单提交
console.log(this.username, this.password);
}
}
}
</script>
在上面的例子中,当用户点击submit按钮时,表单会提交,同时Vue实例中的submitForm方法会被调用,从而处理表单的提交。
需要注意的是,在处理表单提交时,可以使用prevent修饰符防止表单的默认提交行为,也可以使用stop修饰符防止事件冒泡。
三、computed和watch
在Vue中,computed和watch都是用来监听数据变化的,但是它们的用途和实现方式有所不同。
- computed
computed是Vue提供的一个计算属性,它是基于响应式依赖进行缓存的,即只有当依赖的数据发生变化时,才会重新计算。computed的特点是:
- computed是一个函数,它返回一个计算结果。
- computed的计算结果会被缓存,只有依赖的数据发生变化时才会重新计算。
- computed的计算结果是响应式的,即当依赖的数据发生变化时,会自动更新计算结果,从而更新视图。
computed适合用来处理一些复杂的计算逻辑,例如过滤、排序、格式化等。
- watch
watch是Vue提供的一个监听器,它用来监听指定数据的变化,并在数据变化时执行指定的回调函数。watch的特点是:
- watch是一个对象,它的属性是需要监听的数据,值是回调函数。
- watch监听的数据发生变化时,会执行对应的回调函数。
- watch可以监听多个数据,也可以同时监听多个数据的变化。
watch适合用来处理一些异步操作或者需要执行副作用的操作,例如发送网络请求、操作DOM等。
四、class和style
在Vue中,可以使用v-bind指令来动态绑定class和style。v-bind:class用于绑定class名,v-bind:style用于绑定样式。
- 绑定class
可以通过对象语法或数组语法来绑定class。
对象语法:
<div v-bind:class="{ active: isActive }"></div>
isActive是一个布尔值,如果为true,则该元素会自动添加class名为active。
数组语法:
<div v-bind:class="[activeClass, errorClass]"></div>
其中,activeClass和errorClass是定义好的class名,如果它们的值为true,则该元素会自动添加这些class名。
- 绑定style
可以通过对象语法或数组语法来绑定style。
对象语法:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
其中,activeColor和fontSize是定义好的变量,它们的值会被动态地绑定到该元素的style属性上。
数组语法:
<div v-bind:style="[baseStyles, overridingStyles]"></div>
其中,baseStyles和overridingStyles是定义好的样式对象,它们的属性会被合并到该元素的style属性上。
五、条件
在Vue中,可以使用v-if、v-else-if、v-else指令来实现条件渲染。
- v-if
v-if指令用于根据表达式的值来决定是否渲染一个元素。
例如:
<div v-if="isShow">Hello World</div>
当isShow为true时,该元素会被渲染;当isShow为false时,该元素不会被渲染。
- v-else-if
v-else-if指令用于在v-if指令的后面添加一个条件判断,当v-if的表达式为false时,会判断v-else-if的表达式是否为true,如果为true,则渲染该元素。
例如:
<div v-if="type === 'A'">Type A</div>
<div v-else-if="type === 'B'">Type B</div>
<div v-else>Type C</div>
当type为A时,会渲染第一个div;当type为B时,会渲染第二个div;当type既不是A也不是B时,会渲染第三个div。
- v-else
v-else指令用于在v-if或v-else-if指令的后面添加一个条件判断,当前面的条件都不满足时,会渲染该元素。
例如:
<div v-if="isShow">Hello World</div>
<div v-else>Goodbye World</div>
当isShow为true时,会渲染第一个div;当isShow为false时,会渲染第二个div。
- v-show
v-show 是简单的切换元素的 CSS 属性 display,如果条件为 false,则将元素的 display 属性设置为 none,如果条件为 true,则将元素的 display 属性设置为原来的值。因此,v-show 在切换时有更低的切换开销,但是在初始渲染时有更高的初始开销,因为它需要渲染所有元素,然后再根据条件决定是否显示。
例如:
<div v-show="isShow">Hello World</div>
面试题:v-if 和 v-show 的区别,以及使用场景
v-if 和 v-show 都是 Vue.js 中用于控制元素显示和隐藏的指令,它们的区别在于:
- v-if 是“真正的”条件渲染,它根据条件决定是否渲染元素,如果条件为 false,则不会渲染该元素,如果条件为 true,则会渲染该元素。
- v-show 是简单的切换元素的 CSS 属性 display,如果条件为 false,则将元素的 display 属性设置为 none,如果条件为 true,则将元素的 display 属性设置为原来的值。
根据上述区别, v-if 或 v-show:
- 如果需要频繁切换元素的显示和隐藏,建议使用 v-show,因为它的切换开销更低。
- 如果需要在初始渲染时避免不必要的开销,建议使用 v-if,因为它只在需要时才会渲染元素。
- 如果需要在某些条件下完全销毁元素,建议使用 v-if,因为它可以完全销毁元素,而 v-show 只是简单地隐藏元素。
六、事件
- 传参
- event 参数
- 事件修饰符
- 按键修饰符
- 【注意】用 vue 绑定的事件,组件销毁时会自动被解绑。自己绑定的事件,需要自己销毁。
1、event挂载参数:
//无参数
<button @click="increment1">+1</button>
//传事件本身用$event
<button @click="increment2(2, $event)">+2</button>
2、event参数:
- event 是原生的
- 事件被挂载到当前元素
- 和 DOM 事件一样
increment1(event) {
// eslint-disable-next-line
console.log('event', event, event.__proto__.constructor) // 是原生的 event 对象
// eslint-disable-next-line
console.log(event.target)
// eslint-disable-next-line
console.log(event.currentTarget) // 注意,事件是被注册到当前元素的,和 React 不一样
this.num++
},
1.事件修饰符
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
2、按键修饰符
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button @click.ctrl="onClick">A</button>
<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>
七、表单
在 Vue 中,v-model 指令可以用于双向数据绑定。在 v-model 中,可以使用修饰符来改变默认行为。下面是关于 trim、lazy 和 number 修饰符的说明:
- trim 修饰符:用于去除输入框的首尾空格。
例如:
<input v-model.trim="message">
在这个例子中,如果用户在输入框中输入了 " hello ",则 message 的值将被设置为 "hello",去除了首尾空格。
- lazy 修饰符:用于延迟更新数据,即在失去焦点或按下回车键后才更新数据。
例如:
<input v-model.lazy="message">
在这个例子中,如果用户在输入框中输入了 "hello",则 message 的值不会立即更新,而是在用户失去焦点或按下回车键后才更新。
- number 修饰符:用于将输入框的值转换为数字类型。
例如:
<input v-model.number="age">
在这个例子中,如果用户在输入框中输入了 "18",则 age 的值将被设置为数字类型的 18。
需要注意的是,使用 number 修饰符时,如果输入框中的值无法转换为数字类型,则会将值设置为 undefined。
常见表单项:textarea、checkbox、radio、select
- textarea
<textarea v-model="message"></textarea>
在这个例子中,message 是一个数据属性,可以在 Vue 实例中定义。当用户在 textarea 中输入内容时,message 的值会自动更新。
- checkbox
<input type="checkbox" v-model="checked">
在这个例子中,checked 是一个数据属性,可以在 Vue 实例中定义。当用户勾选或取消勾选复选框时,checked 的值会自动更新。
- radio
<input type="radio" value="male" v-model="gender"> Male
<input type="radio" value="female" v-model="gender"> Female
在这个例子中,gender 是一个数据属性,可以在 Vue 实例中定义。当用户选择男性或女性单选按钮时,gender 的值会自动更新为相应的值。
- select
<select v-model="selected">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
在这个例子中,selected 是一个数据属性,可以在 Vue 实例中定义。当用户选择下拉列表中的选项时,selected 的值会自动更新为相应的值。
需要注意的是,对于 checkbox 和 radio,v-model 绑定的值应该是一个布尔类型或字符串类型。如果使用数字类型,需要使用 value 绑定相应的数字值。对于 select,v-model 绑定的值应该是选中选项的 value 值。