v-if
和 v-show
是 Vue.js 中用于条件渲染的指令,它们的作用是根据表达式的值来控制元素的显示与隐藏。它们的区别在于:
v-if
:
v-if
是一个指令,它通过计算绑定的表达式的值来决定是否渲染元素。true
,则渲染对应的元素;如果为 false
,则不渲染(从 DOM 中移除)。v-if
的条件为 false
时,元素及其内部的 Vue 组件会被销毁并重建,每次切换时都会触发销毁和重新渲染的过程。示例:
<div v-if="isVisible">这是通过v-if条件渲染的元素div>
v-show
:v-show
是一个指令,它同样通过计算绑定的表达式的值来决定元素的显示与隐藏。true
,则显示元素(通过 CSS 的 display
属性控制);如果为 false
,则隐藏元素(通过 display: none
)。v-show
的条件为 false
时,元素并未从 DOM 中移除,而是通过 CSS 控制隐藏,不会触发销毁和重新渲染的过程。示例:
<div v-show="isVisible">这是通过v-show条件渲染的元素div>
选择使用:
v-show
,因为它不会频繁触发 DOM 的销毁和重建。false
时完全从 DOM 中移除元素以节省资源,可以考虑使用 v-if
。MVVM(Model-View-ViewModel)是一种软件架构模式,旨在分离用户界面(UI)的开发与业务逻辑的开发,以提高代码的可维护性、可测试性和复用性。MVVM 架构包含三个主要部分:
MVVM 的工作原理如下:
key
属性提供了一种唯一标识列表中每个子元素的方式。Vue 使用这些 key
来识别每个子元素,并在更新 DOM 时使用它们来确定哪些元素是新增的、删除的或重新排序的。key
属性能够帮助 Vue 优化列表的渲染性能。当列表中的数据发生变化时,Vue 可以根据 key
属性识别出哪些元素是已知的,从而避免不必要的 DOM 操作,提高渲染效率。v-for
使用: 在使用 v-for
指令渲染列表时,为每个列表项添加 key
属性是推荐的做法。这样可以确保 Vue 能够正确地跟踪和管理列表中的每个子元素,确保 DOM 的正确更新和重用。例如,在您的 Vue 模板中的 v-for
循环中,您可以将每个列表项的 id
作为 key
属性,以确保每个列表项都有一个唯一的标识:
<ul>
<li v-for="item in list" :key="item.id">{{ item.name }}li>
ul>
在这里,假设 item.id
是列表项的唯一标识符,将其用作 key
属性能够帮助 Vue 在列表项发生变化时更有效地管理和更新 DOM。
Vue.js 的生命周期钩子函数是一组可以让我们在 Vue 实例中的特定阶段添加自定义逻辑的方法。这些钩子函数可以帮助我们在组件的不同生命周期阶段执行任务,从而实现对应用状态的管理和控制。
Vue.js 的生命周期包括以下阶段:
data
、methods
、computed
等属性和方法。除了这些主要的生命周期钩子函数外,Vue 还提供了一些其它的钩子函数,用于处理特定场景下的逻辑,例如 activated
和 deactivated
用于 keep-alive 组件,errorCaptured
用于捕获子孙组件的错误等。
在 Vue.js 中,created
和 mounted
都是生命周期钩子函数,用于在 Vue 实例的不同阶段执行任务。虽然它们看起来有些类似,但在请求数据时有一些重要的区别:
created 钩子:
created
钩子函数在 Vue 实例被创建之后立即执行,此时 Vue 实例的数据观测 (data observer) 已经完成,但是挂载阶段还未开始,因此实例还没有被挂载到 DOM 上。created
钩子中进行数据请求时,一般适合初始化实例数据、设置计算属性或监听事件,因为此时实例已经创建,但 DOM 和模板还未渲染完成,无法操作页面上的元素。created() {
axios.get('https://api.example.com/data')
.then(response => {
this.data = response.data;
})
.catch(error => {
console.error('Error fetching data:', error);
});
}
mounted 钩子:
mounted
钩子函数在 Vue 实例被挂载到 DOM 后执行,此时 Vue 实例已经完成了挂载,可以访问到 DOM 元素。mounted
钩子中进行数据请求时,适合执行需要操作 DOM 元素的任务,例如初始化第三方库、调用 DOM API、绑定事件等。mounted() {
axios.get('https://api.example.com/data')
.then(response => {
this.data = response.data;
})
.catch(error => {
console.error('Error fetching data:', error);
});
}
区别总结:
created
钩子中发起请求,这样可以更早地获取数据并初始化组件状态。mounted
钩子中执行,以确保能够访问到已挂载的 DOM 元素。mounted
钩子中,因为这样可以避免一些由于数据获取过早而导致的问题,例如初始化数据可能在实例完全创建前就被访问。在 Vue.js 中,修饰符是用于对指令或事件进行额外控制或修改行为的特殊标记。以下是常见的 Vue.js 指令和事件修饰符:
.prevent
event.preventDefault()
<form @submit.prevent="handleSubmit">form>
.stop
event.stopPropagation()
<div @click.stop="handleClick">div>
.capture
<div @click.capture="handleClick">div>
.self
<div @click.self="handleClick">div>
.once
vm.$once
方法<button @click.once="handleClick">Click Mebutton>
.passive
preventDefault
完成,可以加快页面滚动的性能<div @touchstart.passive="handleTouchStart">div>
.stop
event.stopPropagation()
<button @click.stop="handleClick">button>
.prevent
event.preventDefault()
<form @submit.prevent="handleSubmit">form>
.capture
<div @click.capture="handleClick">div>
.self
<div @click.self="handleClick">div>
.once
vm.$once
方法<button @click.once="handleClick">button>
.passive
preventDefault
完成,可以加快页面滚动的性能<div @touchstart.passive="handleTouchStart">div>
Element UI 是一个基于 Vue.js 的组件库,提供了丰富的 UI 组件和功能,包括表单验证。Element UI 中的表单验证是通过使用 el-form
和 el-form-item
组件结合内置的验证规则和方法来实现的。
下面是 Element UI 表单验证的基本步骤和示例:
使用 el-form
组件包裹表单内容
<template>
<el-form :model="formData" :rules="formRules" ref="form" label-width="100px">
<el-form-item label="用户名" prop="username">
<el-input v-model="formData.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="formData.password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
formData: {
username: '',
password: ''
},
formRules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
};
},
methods: {
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
// 表单验证通过,执行提交操作
// 可以在这里调用接口等操作
console.log('表单验证通过');
} else {
// 表单验证不通过
console.log('表单验证未通过');
return false;
}
});
}
}
};
</script>
在 el-form
中设置 :model
和 :rules
:model
绑定表单数据对象,用于收集表单数据。:rules
绑定表单验证规则,定义每个字段的验证规则。使用 el-form-item
包裹表单项
el-form-item
组件包裹,设置 label
属性为表单项的标签名,设置 prop
属性为表单项数据对象中的字段名。定义表单验证规则
data
中定义 formRules
对象,为每个表单字段设置验证规则数组。提交表单
this.$refs.form.validate(callback)
方法进行表单验证。callback
回调函数接收一个 valid
参数,表示表单验证结果是否通过。通过以上步骤,可以实现基于 Element UI 的表单验证功能。验证规则中的 trigger
属性指定了触发验证的时机,常见的值有 'blur'
(失去焦点时触发)和 'change'
(数据变化时触发)。 Element UI 提供了丰富的验证规则和验证方法,可以满足常见的表单验证需求。
Vue.js 中有多种方法用于组件之间的通信,其中包括 props、事件、vuex 状态管理以及 provide/inject 等。这些方法可以根据不同的场景和需求来选择和组合使用。
Props/Events
父组件通过 props 向子组件传递数据,子组件通过事件 $emit
向父组件发送消息。
父组件向子组件传递数据:
子组件接收 props 并发送事件:
Event Bus
使用 Vue 实例作为事件总线,用于任意组件之间的通信。
// main.js
import Vue from 'vue';
export const bus = new Vue();
在组件中使用:
// ComponentA.vue
import { bus } from './main.js';
bus.$emit('event-name', data);
// ComponentB.vue
import { bus } from './main.js';
bus.$on('event-name', (data) => {
console.log('Received data:', data);
});
Vuex
Provide/Inject
父组件使用 provide
来提供数据,子组件使用 inject
来注入数据。
{{ sharedData }}
keep-alive 是 Vue.js 中的一个内置组件,用于将包含的组件保留状态,或避免重新渲染。这意味着当组件被切换出去时,它的状态和 DOM 结构不会被销毁,而是被缓存起来,当再次切换回该组件时,可以直接使用缓存的状态和 DOM,而不需要重新初始化组件。这对于需要保持状态或避免不必要的重新渲染的组件非常有用。比如当我们从首页
–>列表页
–>商详页
–>再返回
,这时候列表页应该是需要keep-alive
,从首页
–>列表页
–>商详页
–>返回到列表页(需要缓存)
–>返回到首页(需要缓存)
–>再次进入列表页(不需要缓存)
,这时候可以按需来控制页面的keep-alive
。
Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 node.js。它提供了一种简单的方式来发送异步 HTTP 请求到 REST endpoints 并且处理响应。封装 Axios 主要是为了提高代码的可维护性和重用性,以及为了简化 HTTP 请求的使用。
封装 Axios 的一种常见方法是创建一个单独的服务文件或模块,这个文件或模块包含了一些预设的配置和方法,用于处理常见的 HTTP 请求。这样,当你需要发送 HTTP 请求时,你可以直接调用这些预设的方法,而不是每次都需要手动配置 Axios 实例。
以下是一个简单的 Axios 封装示例:
// api.js
import axios from 'axios';
// 创建 axios 实例
const instance = axios.create({
baseURL: 'https://api.example.com', // 基础 URL
timeout: 1000, // 请求超时时间
headers: {
'Content-Type': 'application/json',
},
});
// 请求拦截器
instance.interceptors.request.use((config) => {
// 在发送请求之前做些什么
return config;
}, (error) => {
// 对请求错误做些什么
return Promise.reject(error);
});
// 响应拦截器
instance.interceptors.response.use((response) => {
// 对响应数据做点什么
return response;
}, (error) => {
// 对响应错误做点什么
return Promise.reject(error);
});
// 导出实例
export default instance;
在这个示例中,创建了一个 Axios 实例,并设置了基础 URL、超时时间和默认的请求头。还添加了请求和响应拦截器,以便在发送请求或接收响应时进行一些预处理或后处理。最后,导出了这个实例,以便在其他文件中使用。
使用这个封装后,可以在其他文件中这样使用:
import api from './api';
// 使用封装后的 axios 实例发送 GET 请求
api.get('/user')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});