Vue.js 第二章知识点总结

一、过滤器(Filters)

1. 概念

Vue.js 中用于文本格式化的工具,仅作用于数据展示阶段,不修改原始数据,Vue 2.x 需自定义,Vue 3.x 已移除(推荐用计算属性/方法替代)。

2. 核心用法

  • 全局过滤器(所有组件可用):
    Vue.filter('dateFormat', (value) => {
      return new Date(value).toLocaleDateString(); // 示例:时间戳转日期
    });
    
  • 局部过滤器(仅当前组件可用):
    export default {
      filters: {
        numberFix: (value) => value.toFixed(2) // 示例:数值保留2位小数
      }
    };
    
  • 模板使用{{ timeStamp | dateFormat }}v-bind:title="price | numberFix"

3. 注意点

  • 支持链式调用(如 {{ data | filter1 | filter2 }});
  • 优先级低于计算属性,复杂格式化优先用计算属性。

二、内置指令

1. 概念

Vue 自带的 v- 前缀特殊属性,用于操作 DOM、绑定数据、控制渲染,无需手动定义。

2. 常用指令及功能

指令 功能描述 示例
v-text 渲染纯文本,避免插值闪烁 <span v-text="msg"></span>
v-html 渲染 HTML 内容(需防 XSS,仅信任内容可用) <div v-html="richText"></div>
v-bind 动态绑定属性(简写 : <img :src="imgUrl">
v-on 绑定事件(简写 @,支持修饰符 .stop/.prevent <button @click="handleClick">
v-model 表单双向绑定(仅用于 input/select 等表单元素) <input v-model="username">
v-for 循环渲染(需加 key 保证唯一性) <li v-for="(item, i) in list" :key="i">{{ item }}</li>
v-if/v-else 条件渲染(动态创建/销毁 DOM,适合一次性切换) <div v-if="isShow">显示</div>
v-show 条件展示(仅切换 display: none,适合频繁切换) <div v-show="isShow">显示</div>
v-pre 跳过模板编译,直接显示原始插值(如展示 {{ }} 符号) <span v-pre>{{ raw }}</span>
v-cloak 隐藏未编译插值(配合 CSS [v-cloak]{display:none} 解决闪烁) <div v-cloak>{{ msg }}</div>

三、自定义指令(Directives)

1. 概念

用户自定义的 v-xxx 指令,用于封装 DOM 操作逻辑(如自动聚焦、权限控制),弥补内置指令不足。

2. 核心用法

  • 全局指令(所有组件可用):
    Vue.directive('focus', {
      inserted(el) { // 元素插入 DOM 时执行(常用钩子)
        el.focus(); // 示例:输入框自动聚焦
      }
    });
    
  • 局部指令(仅当前组件可用):
    export default {
      directives: {
        permission: {
          bind(el, binding) { // 指令绑定到元素时执行
            // 示例:无权限则隐藏元素
            if (!binding.value) el.style.display = 'none';
          }
        }
      }
    };
    
  • 模板使用<input v-focus><button v-permission="hasAuth">按钮</button>

3. 核心钩子

  • bind:指令绑定元素时调用(1次);
  • inserted:元素插入 DOM 时调用;
  • update:元素所在组件更新时调用。

四、生命周期(Lifecycle)

1. 概念

Vue 实例从创建 → 运行 → 销毁的全过程,每个阶段触发特定“钩子函数”,供开发者执行逻辑。

2. Vue 2.x 核心生命周期(常用)

阶段 钩子函数 执行时机 常用场景
创建阶段 beforeCreate 实例初始化后,数据/方法未挂载 -(无可用数据,极少用)
created 数据/方法已挂载,DOM 未渲染 发送初始化请求、初始化数据
挂载阶段 beforeMount 模板编译完成,未渲染到页面 -(极少用)
mounted DOM 已渲染,实例挂载完成 操作 DOM、初始化第三方插件(如 ECharts)
更新阶段 beforeUpdate 数据变化,DOM 未更新 -(极少用)
updated DOM 已更新 基于更新后的 DOM 执行逻辑(避免修改数据)
销毁阶段 beforeDestroy 实例即将销毁,数据/方法仍可用 清理定时器、解绑事件监听
destroyed 实例完全销毁,数据/事件失效 -(极少用)

3. 注意点

  • Vue 3.x 钩子前缀改为 on(如 onMounted),组合式 API 中需手动调用;
  • 避免在 updated 中修改数据,防止无限循环。

五、组件(Components)

1. 概念

Vue 中可复用的 UI 单元,将页面拆分为独立模块(如 NavbarListItem),提高代码复用性和维护性。

2. 分类与用法

  • 全局组件(所有实例可用):
    Vue.component('GlobalButton', {
      template: '<button @click="handleClick">{{ btnText }}</button>',
      data() { return { btnText: '全局按钮' } },
      methods: { handleClick() { alert('点击全局按钮') } }
    });
    
  • 局部组件(仅父组件可用):
    // 子组件 Child.vue
    <template><div>{{ childMsg }}</div></template>
    <script>
      export default { data() { return { childMsg: '局部组件' } } }
    </script>
    // 父组件中引入
    import Child from './Child.vue';
    export default { components: { Child } } // 注册局部组件
    
  • 单文件组件(SFC).vue 文件,包含 <template>(模板)、<script>(逻辑)、<style>(样式),是实战主流。

3. 核心特性

  • 组件间独立作用域(数据不共享,需通过 props/事件通信);
  • 支持嵌套(父子组件)和递归(组件自身调用自身)。

六、脚手架(Vue CLI)

1. 概念

Vue 官方提供的命令行工具,快速搭建标准化 Vue 项目(自动配置 Webpack、Babel、ESLint 等)。

2. 核心操作(Vue 2.x/3.x 通用)

  1. 安装npm install -g @vue/cli(Vue 3.x)或 npm install -g vue-cli(Vue 2.x);
  2. 创建项目vue create project-name(选择预设:默认/手动配置,如选 Router、Vuex);
  3. 启动开发环境cd project-namenpm run serve(默认端口 8080,浏览器访问 http://localhost:8080);
  4. 打包生产环境npm run build(生成 dist 目录,用于部署到服务器)。

3. 项目结构(关键目录)

  • src/:源代码目录(components/ 组件、router/ 路由、store/ 状态管理);
  • public/:静态资源目录(index.html 入口文件);
  • vue.config.js:项目配置文件(修改端口、代理等)。

七、Render 函数

1. 概念

JavaScript 代码编写模板的函数,替代 <template>,适合动态生成复杂 DOM 结构(如根据条件渲染不同组件)。

2. 核心用法(Vue 2.x)

  • 基础语法:render: h => h(标签/组件, 配置项, 子元素)hcreateElement,用于创建 VNode);
  • 示例(渲染带点击事件的组件):
    import CustomButton from './CustomButton.vue';
    export default {
      render(h) {
        return h(CustomButton, {
          props: { btnText: 'Render 生成按钮' }, // 传递 props
          on: { click: () => alert('点击 Render 按钮') } // 绑定事件
        }, ['按钮内部文本']); // 子元素(可选)
      }
    };
    

3. 注意点

  • Vue 3.x 中 render 函数参数改为 createVNode(需从 vue 导入);
  • 支持 JSX(需配置 @vue/babel-plugin-jsx 插件,语法更接近 HTML)。

八、修改默认配置(Vue CLI)

1. 概念

通过配置文件修改 Vue CLI 项目的默认设置(如端口、代理、打包路径),无需修改底层 Webpack 配置。

2. 核心配置文件:vue.config.js

在项目根目录创建 vue.config.js,常用配置示例:

module.exports = {
  // 1. 修改开发环境端口
  devServer: {
    port: 8081, // 自定义端口
    open: true, // 启动后自动打开浏览器
    proxy: { // 配置接口代理(解决跨域)
      '/api': {
        target: 'http://localhost:3000', // 后端接口地址
        pathRewrite: { '^/api': '' }, // 去掉请求中的 /api 前缀
        ws: true, // 支持 WebSocket
        changeOrigin: true // 模拟跨域请求
      }
    }
  },
  // 2. 修改打包路径(解决部署后资源 404)
  publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
  // 3. 关闭 eslint 校验(开发阶段可选)
  lintOnSave: false
};

九、ref 属性

1. 概念

Vue 中用于获取 DOM 元素或组件实例的属性,替代原生 document.querySelector

2. 核心用法

  • 获取 DOM 元素
    <template><div ref="box">我是 DOM 元素</div></template>
    <script>
      export default {
        mounted() {
          console.log(this.$refs.box); // 输出 <div> 元素
          this.$refs.box.style.color = 'red'; // 操作 DOM 样式
        }
      }
    </script>
    
  • 获取组件实例
    <template><Child ref="childCom"></Child></template>
    <script>
      import Child from './Child.vue';
      export default {
        components: { Child },
        mounted() {
          console.log(this.$refs.childCom); // 输出 Child 组件实例
          this.$refs.childCom.childMethod(); // 调用子组件方法
        }
      }
    </script>
    

3. 注意点

  • $refs 仅在 mounted 钩子后可用(DOM 已渲染);
  • 非响应式(修改 $refs 不会触发页面重新渲染)。

十、props 配置

1. 概念

父子组件通信的核心方式,用于父组件向子组件传递数据(单向数据流:父变子更,子不能直接修改 props)。

2. 核心用法

  • 子组件声明 props(3种方式):
    export default {
      // 方式1:仅指定类型
      props: ['msg', 'count'],
      // 方式2:指定类型(推荐)
      props: {
        msg: String,
        count: Number
      },
      // 方式3:详细配置(类型、必填、默认值、验证,推荐)
      props: {
        msg: {
          type: String,
          required: true, // 必填
          default: '默认文本' // 非必填时的默认值
        },
        count: {
          type: Number,
          validator: (value) => value >= 0 // 自定义验证:值必须 >= 0
        }
      }
    };
    
  • 父组件传递数据
    <!-- 静态值直接传,动态值用 v-bind -->
    <Child msg="静态文本" :count="parentCount"></Child>
    <script>
      export default { data() { return { parentCount: 10 } } }
    </script>
    

3. 注意点

  • 子组件若需修改 props,需通过 $emit 触发父组件事件,由父组件修改数据;
  • 传递对象/数组时,子组件修改内部属性会影响父组件(因引用类型共享地址,需避免)。

十一、Mixin 混入

1. 概念

用于复用组件选项的工具,将多个组件共享的逻辑(数据、方法、生命周期)提取为“混入对象”,减少代码冗余。

2. 核心用法

  • 定义混入对象
    // mixins/commonMixin.js
    export default {
      data() {
        return { mixinData: '共享数据' }
      },
      methods: {
        mixinMethod() { console.log('共享方法') }
      },
      mounted() { console.log('混入的 mounted 钩子') }
    };
    
  • 局部混入(仅当前组件可用):
    import commonMixin from './mixins/commonMixin';
    export default {
      mixins: [commonMixin], // 引入混入(支持数组,可多个)
      mounted() {
        console.log(this.mixinData); // 访问混入数据
        this.mixinMethod(); // 调用混入方法
      }
    };
    
  • 全局混入(所有组件可用,慎用,易污染):
    import commonMixin from './mixins/commonMixin';
    Vue.mixin(commonMixin);
    

3. 合并规则

  • 数据(data):组件数据覆盖混入数据(同名时);
  • 生命周期钩子:混入和组件的钩子都会执行,混入钩子先触发;
  • 方法/计算属性:同名时组件的覆盖混入的。

十二、插件(Plugins)

1. 概念

用于扩展 Vue 功能的工具,可添加全局方法、指令、混入、实例方法等(如 vue-routervuex 均为插件)。

2. 核心用法

  • 定义插件(需暴露 install 方法):
    // plugins/myPlugin.js
    export default {
      install(Vue, options) {
        // 1. 添加全局指令
        Vue.directive('focus', { inserted(el) { el.focus() } });
        // 2. 添加实例方法(通过原型)
        Vue.prototype.$myMethod = (msg) => console.log('自定义方法:', msg);
        // 3. 添加全局混入
        Vue.mixin({ mounted() { console.log('插件混入的 mounted') } });
      }
    };
    
  • 使用插件(在 main.js 中):
    import myPlugin from './plugins/myPlugin';
    Vue.use(myPlugin, { /* 可选配置参数 */ }); // 需在 new Vue() 前调用
    

3. 常用官方插件

  • vue-router:路由管理;
  • vuex:状态管理;
  • vue-i18n:国际化;
  • vue-lazyload:图片懒加载。

十三、scoped 样式

1. 概念

Vue 单文件组件中 <style scoped> 的属性,用于限制样式仅作用于当前组件,避免样式污染(不同组件同名类名冲突)。

2. 核心原理

Vue 会为当前组件的 DOM 元素添加唯一 data-v-xxx 属性,同时为样式选择器添加该属性前缀(如 .box 变为 .box[data-v-xxx]),确保样式仅匹配当前组件 DOM。

3. 用法与注意点

  • 基础用法
    <style scoped>
      .box { color: red; } /* 仅作用于当前组件的 .box 元素 */
    </style>
    
  • 修改子组件样式(父组件中):
    需用 deep 选择器(穿透 scoped),语法:
    /* Vue 2.x */
    ::v-deep .child-box { color: blue; }
    /* 或 */
    /deep/ .child-box { color: blue; }
    /* Vue 3.x */
    :deep(.child-box) { color: blue; }
    
  • 全局样式:不加 scoped<style> 标签为全局样式,作用于所有组件。

十四、浏览器本地存储

1. 概念

Vue 项目中常用的客户端数据存储方案,用于保存用户信息、配置等(无需后端,仅存于浏览器),主要有 localStoragesessionStorage

2. 两者对比与用法

特性 localStorage sessionStorage
存储时长 永久存储(手动删除才消失) 会话级(关闭标签页/浏览器后清除)
存储大小 约 5MB 约 5MB
共享范围 同域名下所有页面共享 仅当前标签页共享
核心方法 setItem/getItem/removeItem/clear 同左
  • 示例(存储用户信息)
    // 存储(需将对象转为 JSON 字符串,因本地存储仅存字符串)
    const user = { name: '张三', id: 1 };
    localStorage.setItem('user', JSON.stringify(user));
    // 获取(需解析 JSON)
    const storedUser = JSON.parse(localStorage.getItem('user'));
    // 删除指定键
    localStorage.removeItem('user');
    // 清空所有存储
    localStorage.clear();
    

3. 注意点

  • 避免存储敏感数据(如密码,易被篡改和查看);
  • 存储数据量不宜过大,否则影响页面加载性能。

十五、组件自定义事件

1. 概念

父子组件通信的核心方式(子向父传递数据),由父组件绑定事件,子组件触发事件并传参。

2. 核心用法

  1. 父组件绑定事件
    <template>
      <!-- 绑定自定义事件 custom-event,触发父组件的 parentMethod 方法 -->
      <Child @custom-event="parentMethod"></Child>
    </template>
    <script>
      export default {
        methods: {
          parentMethod(data) {
            console.log('收到子组件数据:', data); // 接收子组件传递的数据
          }
        }
      }
    </script>
    
  2. 子组件触发事件
    <template>
      <button @click="handleClick">向父组件传值</button>
    </template>
    <script>
      export default {
        methods: {
          handleClick() {
            // 触发自定义事件 custom-event,并传递参数
            this.$emit('custom-event', '子组件的消息');
          }
        }
      }
    </script>
    

3. 注意点

  • 自定义事件名推荐用“kebab-case”(短横线命名),与原生事件区分;
  • 解绑事件:在父组件 beforeDestroy 中调用 this.$off('custom-event'),防止内存泄漏;
  • 若需一次性触发事件,可用 this.$once('custom-event', callback)

十六、全局事件总线(Global Event Bus)

1. 概念

用于非父子组件通信(如兄弟组件、跨层级组件)的“中间桥梁”,本质是一个全局共享的 Vue 实例,通过“绑定事件”和“触发事件”传递数据。

2. 核心用法(Vue 2.x)

  1. 创建全局事件总线(在 main.js 中):
    // 给 Vue 原型添加 $bus 属性,指向新的 Vue 实例(作为事件总线)
    Vue.prototype.$bus = new Vue();
    
  2. 发送方组件(触发事件传参)
    export default {
      methods: {
        sendData() {
          // 通过 $bus 触发事件 event-name,并传递数据
          this.$bus.$emit('event-name', '要传递的数据');
        }
      }
    };
    
  3. 接收方组件(绑定事件接收数据)
    export default {
      mounted() {
        // 绑定事件 event-name,接收数据
        this.$bus.$on('event-name', (data) => {
          console.log('收到数据:', data);
        });
      },
      beforeDestroy() {
        // 解绑事件,防止内存泄漏(关键!)
        this.$bus.$off('event-name');
      }
    };
    

3. 注意点

  • Vue 3.x 无 Vue.prototype,需用 app.config.globalProperties 替代:
    const app = createApp(App);
    app.config.globalProperties.$bus = new app();
    
  • 避免滥用,复杂项目推荐用 Vuex/Pinia 管理状态。

生活感悟

这周学习Vue时,看视频觉得都懂了,一写代码就遇到各种问题,感觉还是需要勤加练习,手不能生

下周计划与学习目标

继续学习Vue,抓紧时间赶赶进度

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐