## 一、事件修饰符 处理DOM事件时可以通过Vue封装的事件修饰符用作后缀加在事件后实现 常见修饰符如下 | 名称 | 可用事件 | 说明 | | -------- | -------- | ---------------------------------------------- | | .stop | 任意 | 当事件触发时,阻止事件冒泡 | | .prevent | 任意 | 当事件触发时,阻止元素默认行为 | | .capture | 任意 | 当事件触发时,阻止事件捕获 | | .self | 任意 | 限制事件仅用作与节点自身 | | .once | 任意 | 事件被触发一次后即解除监听 | | .passive | 滚动 | 移动端,限制事件永不调用`preventDefault()`方法 | 使用方法 ```html 点击我 ``` ## 二、按键修饰符 对于键盘事件的监听,Vue中可以通过`@keyup.enter`来监听回车键的按下,同样的通过键值也可以监听回车键的按下`@keyup.13` 常用按键修饰符与其别名 | 别名修饰符 | 键值修饰符 | 对应按键 | | ---------- | ---------- | --------- | | .delete | .8/.46 | 退格/删除 | | .tab | .9 | 制表 | | .enter | .13 | 回车 | | .esc | .27 | 退出 | | .space | .32 | 空格 | | .left | .37 | 左 | | .up | .38 | 上 | | .right | .39 | 右 | | .down | .40 | 下 | ## 三、组合修饰符 在某些场景下需要通过按键组合才能进行某些操作,可以使用Vue提供的系统按钮修饰符实现 | 修饰符 | 对应按键 | | ------ | ------------ | | .ctrl | Ctrl | | .alt | Alt | | .shift | Shift | | .meta | Meta/Windows | ## 四、双向绑定数据更新修饰符 在使用`v-model:...`时,在某些场景下需要类型转换或懒加载,可以在加上修饰符后缀 | 修饰符 | 说明 | | ------- | ------------------------------------------------------------ | | .lazy | 将用户输入的数据赋值于变量的时机由输入时延迟到数据改不改变时 | | .number | 将输入的数据转换为你数值类型 | | .trim | 去除输入数据首尾的空白字符 | ## 五、数组操作方法 #### 1、会改变原数组的方法 | 方法名 | 参数 | 作用 | 返回值 | | :----------------- | :---------------------------------------------------------------------------------------- | :----------------------------------------------------- | :------------------------------- | | **`push()`** | `item1, item2, ..., itemN` | 在**数组末尾**添加一个或多个元素。 | 数组新的**`length`**。 | | **`pop()`** | (无) | 删除并返回数组的**最后一个**元素。 | 被删除的**元素**。 | | **`unshift()`** | `item1, item2, ..., itemN` | 在**数组开头**添加一个或多个元素。 | 数组新的**`length`**。 | | **`shift()`** | (无) | 删除并返回数组的**第一个**元素。 | 被删除的**元素**。 | | **`splice()`** | `start`(起始索引), `deleteCount`(要删除的元素数), `item1, ..., itemN`(要添加的元素) | **万能方法**:在指定位置**删除/替换/添加**元素。 | 由**被删除的元素**组成的数组。 | | **`reverse()`** | (无) | 将数组中元素的顺序**反转**。 | 反转后的**原数组引用**。 | | **`sort()`** | `compareFunction`(可选,排序规则函数) | 对数组元素进行**排序**。默认按字符串Unicode码点排序。 | 排序后的**原数组引用**。 | | **`copyWithin()`** | `target`(目标位置), `start`(起始位置), `end`(结束位置,可选) | 将数组内部指定位置的元素**复制**到同一数组的另一位置。 | 改变后的**原数组**。 | | **`fill()`** | `value`(填充值), `start`(起始索引,可选), `end`(结束索引,可选) | 将数组中指定区间的所有元素替换为一个**固定值**。 | 改变后的**原数组**。 | #### 2、不会改变原数组方法 | 方法名 | 参数 | 作用 | 返回值 | | :------------------ | :------------------------------------------------------------- | :-------------------------------------------------------------- | :------------------------------------ | | **`concat()`** | `array1, array2, ..., arrayN` 或 `value1, value2, ...` | **合并**两个或多个数组,或将值合并到数组。 | 一个**新数组**。 | | **`slice()`** | `start`(起始索引,可选), `end`(结束索引,可选) | **截取**数组的一部分,从 `start` 到 `end`(不包括 `end`)。 | 由截取元素组成的**新数组**。 | | **`join()`** | `separator`(分隔符,默认为逗号 `,`) | 将数组的所有元素连接成一个**字符串**。 | 连接后的**字符串**。 | | **`indexOf()`** | `searchElement`(要查找的元素), `fromIndex`(起始索引,可选) | 返回在数组中找到给定元素的**第一个索引**。 | 找到则返回**索引**,否则返回 **-1**。 | | **`lastIndexOf()`** | `searchElement`, `fromIndex`(可选) | 返回在数组中找到给定元素的**最后一个索引**(从后往前找)。 | 找到则返回**索引**,否则返回 **-1**。 | | **`includes()`** | `searchElement`, `fromIndex`(可选) | 判断数组是否包含某个元素(ES2016)。 | **布尔值**(`true` / `false`)。 | | **`toString()`** | (无) | 将数组转换为字符串,元素用逗号分隔。 | 数组的字符串表示。 | | **`flat()`** | `depth`(展开深度,默认为1) | 将**多维数组**“拉平”成一维数组(ES2019)。 | **新数组**。 | | **`flatMap()`** | `callback`(处理函数) | 先对每个元素执行`map()`,然后对返回值执行 `flat(1)`(ES2019)。 | **新数组**。 | #### 3、迭代方法 | 方法名 | 参数 | 作用 | 返回值 | | :------------------ | :------------------------------------------------------- | :--------------------------------------------------------------------------- | :------------------------------------------- | | **`forEach()`** | `callback`(处理每个元素的函数) | 为数组的每个元素执行一次提供的函数。 | **`undefined`**。 | | **`map()`** | `callback`(映射函数) | 创建一个**新数组**,其结果是该数组中的每个元素调用一次提供的函数后的返回值。 | 由回调函数结果组成的**新数组**。 | | **`filter()`** | `callback`(测试函数) | 创建一个**新数组**,包含所有通过测试函数(返回 `true`)的元素。 | 通过测试的元素组成的**新数组**。 | | **`find()`** | `callback`(测试函数) | 返回数组中满足测试函数的**第一个元素**。 | 找到的**元素**,否则返回 **`undefined`**。 | | **`findIndex()`** | `callback`(测试函数) | 返回数组中满足测试函数的**第一个元素的索引**。 | 找到的**索引**,否则返回 **-1**。 | | **`some()`** | `callback`(测试函数) | 测试数组中是否**至少有一个**元素通过了测试函数。 | **布尔值**。 | | **`every()`** | `callback`(测试函数) | 测试数组中的**所有**元素是否都通过了测试函数。 | **布尔值**。 | | **`reduce()`** | `callback`(累加器函数), `initialValue`(初始值,可选) | 对数组中的每个元素执行一个 reducer 函数,将其结果汇总为**单个返回值**。 | 累加后的**最终值**。 | | **`reduceRight()`** | 同`reduce` | 与`reduce` 相同,但从右向左执行。 | 累加后的**最终值**。 | ## 六、Vue2组件渲染方式 与Vue3不同的是`vue`中没有`createApp`方法,所以使用`render:h => h(App)`进行渲染。 ```js import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI); Vue.config.productionTip = false new Vue({ router, store, render: h => h(App), }).$mount('#app'); ``` ## 七、Vue2的Vuex使用 #### 1、创建并引用`store` 一般目录结构 ```yml /store /modules /模块.js /index.js ``` index.js ```js import Vue from 'vue' import Vuex from 'vuex' import counter from './modules/counter' // 使用Vuex Vue.use(Vuex) export default new Vuex.Store({ state: { // 全局属性 }, getters: { // 全局计算属性 }, mutations: { // 修改属性的同步方法 }, actions: { // 修改属性的异步方法 }, modules: { // 模块引入 counter } }) ``` 以模块`counter.js`为例 ```js export default { namespaced: true, // 开启命名空间 state: { count: 0, }, getters: { // Vuex可以自动注入当前模块的state, getters, rootState, rootGetters以及context对象 // rootState 根状态 // rootGetters 根getters doubleCount(state, rootState, rootGetters) { console.log(state, rootState, rootGetters); return state.count * 2; } }, mutations: { addCount(state) { state.count++; } }, actions: { // context 上下文对象, 与store相同包含 commit, dispatch, state, getters 等属性 // 可以通过context获取state和getters中的值,或者提交mutations,分发actions // 在模块中,context还会具有rootState和rootGetters属性 addCountAsync(context) { setTimeout(() => { context.commit('addCount') }, 1000); } } } ``` main.js注册 ```js import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App), }).$mount('#app'); ``` #### 2、组件中使用 可以直接使用`$store`对象进行调用(在js中需要用`this.$store`),也可以使用辅助函数展开 ```html {{ msg }} | {{ count }} | {{ $store.getters['counter/doubleCount'] }} 增加 异步增加 ``` ## 八、监听组件尺寸变化 #### 1、自定义指令 ```js directives: { resize: { bind(el, binding) { const resizeObserver = new ResizeObserver(entries => { entries.forEach(entry => { const {width, height} = entry.contentRect; // 调用传入的回调函数 binding.value({width, height}); }); }); resizeObserver.observe(el); // 保存 resizeObserver 实例,便于销毁 el._resizeObserver = resizeObserver; }, unbind(el) { // 在指令解绑时停止监听 if (el._resizeObserver) { el._resizeObserver.disconnect(); } } } } ``` #### 2、使用`v-resize` ```html ``` Loading... ## 一、事件修饰符 处理DOM事件时可以通过Vue封装的事件修饰符用作后缀加在事件后实现 常见修饰符如下 | 名称 | 可用事件 | 说明 | | -------- | -------- | ---------------------------------------------- | | .stop | 任意 | 当事件触发时,阻止事件冒泡 | | .prevent | 任意 | 当事件触发时,阻止元素默认行为 | | .capture | 任意 | 当事件触发时,阻止事件捕获 | | .self | 任意 | 限制事件仅用作与节点自身 | | .once | 任意 | 事件被触发一次后即解除监听 | | .passive | 滚动 | 移动端,限制事件永不调用`preventDefault()`方法 | 使用方法 ```html <template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <div style="background-color: aqua;height: 200px;width: 200px" @click="handleClickDiv"> <el-button type="primary" @click.stop="handleClickBtn">点击我</el-button> </div> </div> </template> <script> export default { name: 'HomeView', components: {}, methods: { handleClickBtn() { console.log('点击了按钮'); }, handleClickDiv() { console.log('点击了div'); } } } </script> ``` ## 二、按键修饰符 对于键盘事件的监听,Vue中可以通过`@keyup.enter`来监听回车键的按下,同样的通过键值也可以监听回车键的按下`@keyup.13` 常用按键修饰符与其别名 | 别名修饰符 | 键值修饰符 | 对应按键 | | ---------- | ---------- | --------- | | .delete | .8/.46 | 退格/删除 | | .tab | .9 | 制表 | | .enter | .13 | 回车 | | .esc | .27 | 退出 | | .space | .32 | 空格 | | .left | .37 | 左 | | .up | .38 | 上 | | .right | .39 | 右 | | .down | .40 | 下 | ## 三、组合修饰符 在某些场景下需要通过按键组合才能进行某些操作,可以使用Vue提供的系统按钮修饰符实现 | 修饰符 | 对应按键 | | ------ | ------------ | | .ctrl | Ctrl | | .alt | Alt | | .shift | Shift | | .meta | Meta/Windows | ## 四、双向绑定数据更新修饰符 在使用`v-model:...`时,在某些场景下需要类型转换或懒加载,可以在加上修饰符后缀 | 修饰符 | 说明 | | ------- | ------------------------------------------------------------ | | .lazy | 将用户输入的数据赋值于变量的时机由输入时延迟到数据改不改变时 | | .number | 将输入的数据转换为你数值类型 | | .trim | 去除输入数据首尾的空白字符 | ## 五、数组操作方法 #### 1、会改变原数组的方法 | 方法名 | 参数 | 作用 | 返回值 | | :----------------- | :---------------------------------------------------------------------------------------- | :----------------------------------------------------- | :------------------------------- | | **`push()`** | `item1, item2, ..., itemN` | 在**数组末尾**添加一个或多个元素。 | 数组新的**`length`**。 | | **`pop()`** | (无) | 删除并返回数组的**最后一个**元素。 | 被删除的**元素**。 | | **`unshift()`** | `item1, item2, ..., itemN` | 在**数组开头**添加一个或多个元素。 | 数组新的**`length`**。 | | **`shift()`** | (无) | 删除并返回数组的**第一个**元素。 | 被删除的**元素**。 | | **`splice()`** | `start`(起始索引), `deleteCount`(要删除的元素数), `item1, ..., itemN`(要添加的元素) | **万能方法**:在指定位置**删除/替换/添加**元素。 | 由**被删除的元素**组成的数组。 | | **`reverse()`** | (无) | 将数组中元素的顺序**反转**。 | 反转后的**原数组引用**。 | | **`sort()`** | `compareFunction`(可选,排序规则函数) | 对数组元素进行**排序**。默认按字符串Unicode码点排序。 | 排序后的**原数组引用**。 | | **`copyWithin()`** | `target`(目标位置), `start`(起始位置), `end`(结束位置,可选) | 将数组内部指定位置的元素**复制**到同一数组的另一位置。 | 改变后的**原数组**。 | | **`fill()`** | `value`(填充值), `start`(起始索引,可选), `end`(结束索引,可选) | 将数组中指定区间的所有元素替换为一个**固定值**。 | 改变后的**原数组**。 | #### 2、不会改变原数组方法 | 方法名 | 参数 | 作用 | 返回值 | | :------------------ | :------------------------------------------------------------- | :-------------------------------------------------------------- | :------------------------------------ | | **`concat()`** | `array1, array2, ..., arrayN` 或 `value1, value2, ...` | **合并**两个或多个数组,或将值合并到数组。 | 一个**新数组**。 | | **`slice()`** | `start`(起始索引,可选), `end`(结束索引,可选) | **截取**数组的一部分,从 `start` 到 `end`(不包括 `end`)。 | 由截取元素组成的**新数组**。 | | **`join()`** | `separator`(分隔符,默认为逗号 `,`) | 将数组的所有元素连接成一个**字符串**。 | 连接后的**字符串**。 | | **`indexOf()`** | `searchElement`(要查找的元素), `fromIndex`(起始索引,可选) | 返回在数组中找到给定元素的**第一个索引**。 | 找到则返回**索引**,否则返回 **-1**。 | | **`lastIndexOf()`** | `searchElement`, `fromIndex`(可选) | 返回在数组中找到给定元素的**最后一个索引**(从后往前找)。 | 找到则返回**索引**,否则返回 **-1**。 | | **`includes()`** | `searchElement`, `fromIndex`(可选) | 判断数组是否包含某个元素(ES2016)。 | **布尔值**(`true` / `false`)。 | | **`toString()`** | (无) | 将数组转换为字符串,元素用逗号分隔。 | 数组的字符串表示。 | | **`flat()`** | `depth`(展开深度,默认为1) | 将**多维数组**“拉平”成一维数组(ES2019)。 | **新数组**。 | | **`flatMap()`** | `callback`(处理函数) | 先对每个元素执行`map()`,然后对返回值执行 `flat(1)`(ES2019)。 | **新数组**。 | #### 3、迭代方法 | 方法名 | 参数 | 作用 | 返回值 | | :------------------ | :------------------------------------------------------- | :--------------------------------------------------------------------------- | :------------------------------------------- | | **`forEach()`** | `callback`(处理每个元素的函数) | 为数组的每个元素执行一次提供的函数。 | **`undefined`**。 | | **`map()`** | `callback`(映射函数) | 创建一个**新数组**,其结果是该数组中的每个元素调用一次提供的函数后的返回值。 | 由回调函数结果组成的**新数组**。 | | **`filter()`** | `callback`(测试函数) | 创建一个**新数组**,包含所有通过测试函数(返回 `true`)的元素。 | 通过测试的元素组成的**新数组**。 | | **`find()`** | `callback`(测试函数) | 返回数组中满足测试函数的**第一个元素**。 | 找到的**元素**,否则返回 **`undefined`**。 | | **`findIndex()`** | `callback`(测试函数) | 返回数组中满足测试函数的**第一个元素的索引**。 | 找到的**索引**,否则返回 **-1**。 | | **`some()`** | `callback`(测试函数) | 测试数组中是否**至少有一个**元素通过了测试函数。 | **布尔值**。 | | **`every()`** | `callback`(测试函数) | 测试数组中的**所有**元素是否都通过了测试函数。 | **布尔值**。 | | **`reduce()`** | `callback`(累加器函数), `initialValue`(初始值,可选) | 对数组中的每个元素执行一个 reducer 函数,将其结果汇总为**单个返回值**。 | 累加后的**最终值**。 | | **`reduceRight()`** | 同`reduce` | 与`reduce` 相同,但从右向左执行。 | 累加后的**最终值**。 | ## 六、Vue2组件渲染方式 与Vue3不同的是`vue`中没有`createApp`方法,所以使用`render:h => h(App)`进行渲染。 ```js import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI); Vue.config.productionTip = false new Vue({ router, store, render: h => h(App), }).$mount('#app'); ``` ## 七、Vue2的Vuex使用 #### 1、创建并引用`store` 一般目录结构 ```yml /store /modules /模块.js /index.js ``` index.js ```js import Vue from 'vue' import Vuex from 'vuex' import counter from './modules/counter' // 使用Vuex Vue.use(Vuex) export default new Vuex.Store({ state: { // 全局属性 }, getters: { // 全局计算属性 }, mutations: { // 修改属性的同步方法 }, actions: { // 修改属性的异步方法 }, modules: { // 模块引入 counter } }) ``` 以模块`counter.js`为例 ```js export default { namespaced: true, // 开启命名空间 state: { count: 0, }, getters: { // Vuex可以自动注入当前模块的state, getters, rootState, rootGetters以及context对象 // rootState 根状态 // rootGetters 根getters doubleCount(state, rootState, rootGetters) { console.log(state, rootState, rootGetters); return state.count * 2; } }, mutations: { addCount(state) { state.count++; } }, actions: { // context 上下文对象, 与store相同包含 commit, dispatch, state, getters 等属性 // 可以通过context获取state和getters中的值,或者提交mutations,分发actions // 在模块中,context还会具有rootState和rootGetters属性 addCountAsync(context) { setTimeout(() => { context.commit('addCount') }, 1000); } } } ``` main.js注册 ```js import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App), }).$mount('#app'); ``` #### 2、组件中使用 可以直接使用`$store`对象进行调用(在js中需要用`this.$store`),也可以使用辅助函数展开 ```html <template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"><br> {{ msg }} | {{ count }} | {{ $store.getters['counter/doubleCount'] }}<br> <el-button type="primary" @click.stop="addCount">增加</el-button> <el-button type="primary" @click.stop="addCountAsync">异步增加</el-button> </div> </template> <script> import {mapActions, mapGetters, mapMutations, mapState} from "vuex"; export default { name: 'HomeView', components: {}, data() { return {} }, methods: { // 模块中的mutations可以通过模块名访问 ...mapMutations('counter', ['addCount']), // 模块中的actions可以通过模块名访问 ...mapActions('counter', ['addCountAsync']), }, computed: { ...mapState(['msg']), // 模块中的state可以通过模块名访问 ...mapState('counter', ['count']), // 模块中的getters可以通过模块名访问 ...mapGetters('counter', ['doubleCount']), } } </script> ``` ## 八、监听组件尺寸变化 #### 1、自定义指令 ```js directives: { resize: { bind(el, binding) { const resizeObserver = new ResizeObserver(entries => { entries.forEach(entry => { const {width, height} = entry.contentRect; // 调用传入的回调函数 binding.value({width, height}); }); }); resizeObserver.observe(el); // 保存 resizeObserver 实例,便于销毁 el._resizeObserver = resizeObserver; }, unbind(el) { // 在指令解绑时停止监听 if (el._resizeObserver) { el._resizeObserver.disconnect(); } } } } ``` #### 2、使用`v-resize` ```html <template> <div id="main" style="height: 500px;width: 100%;" v-resize="handleResize"> </div> </template> <script> export default { name: 'HomeView', components: {}, data() { return {} }, methods: { handleResize({width, height}) { console.log(width, height); }, }, directives: { resize: { bind(el, binding) { const resizeObserver = new ResizeObserver(entries => { entries.forEach(entry => { const {width, height} = entry.contentRect; // 调用传入的回调函数 binding.value({width, height}); }); }); resizeObserver.observe(el); // 保存 resizeObserver 实例,便于销毁 el._resizeObserver = resizeObserver; }, unbind(el) { // 在指令解绑时停止监听 if (el._resizeObserver) { el._resizeObserver.disconnect(); } } } } } </script> ``` 最后修改:2025 年 12 月 15 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。