Vue有坑慎入

本文介绍了Vue.js中的一些实用技巧,包括如何正确使用v-for循环、v-if条件渲染、模板元素的应用、图片加载的最佳实践及表达式的直接使用等。

vue小总结

正常使用:

<a href="detail.html?id={{ product.id }}" v-for='product in products'>
  <div id='pro-title' v-text='product.title'></div>
  <div v-if="product.status===1">预热中</div>
  <div v-if="product.status===2">众筹中</div>
</a>

//编译的结果:
<a href="detail.html?id=11">
  <div id='pro-title'>标题1</div>
  <div>预热中</div>
</a>
<a href="detail.html?id=12">
  <div id='pro-title'>标题2</div>
  <div>众筹中</div>
</a>

//template和if的区别(一个模块需要循环或者遍历的时候,又不想再外层包一个div)
<template v-if="1===1">
  <div>abc</div>
  <div>dev</div>
</template>
//上面的代码会被编译如下:
<div>abc</div>
<div>dev</div>

使用图片的时候请用以下“:”语法避免vue初始化404:

<img :src="product.imgUrl" class="product-big-img"/>

使用swiper轮播图用一下语法:(:是防止vue初始化404,data-src是swiper做懒加载用的,后面会转化为src)(vue初始化new一定要放在swiper初始化之前)

<img :data-src="banner.bannerPicUrl" class="swiper-lazy"/>
<div class="swiper-lazy-preloader"></div>

vue可以在v-text中直接使用部分函数和部分表达式:

vue可以

<div id="app">
        <div v-text="'&yen;'+message+'元'"></div>
        <div v-text="parseFloat(num).toFixed(2)"></div>
        <div v-text="bool ?'right':'wrong'"></div>
        <div v-text="pic || '/default.png' | addPer host "></div>
    </div>

    <script>
        new Vue({
          el: '#app',
          data: {
            message: 'Hello Vue.js!',
            num:3.1234,
            bool:false,
            pic:'',
            host:'http://www.xyz.com'
          }
        })
    </script>
//运行的结果如下:
¥Hello Vue.js!元
3.00
wrong
http://www.xyz.com/default.png
<think>嗯,用户这次想了解在Vue2中定义全局变量的具体方法。从对话历史来看,用户之前关注过Vue3的全局变量定义,现在需要Vue2的解决方案。用户提供的引用资料里有几个关键点值得注意:引用[1]提到了Vue.prototype的传统方式,引用[2]展示了Vue3的composition API用法,引用[3]则讨论了全局变量复用的重要性。 用户很可能是个Vue开发者,正在处理多组件共享状态的问题。ta特意区分了Vue2和Vue3的差异,说明对版本特性比较敏感。考虑到Vue2在国内存量项目仍广泛使用,这个需求很实际。 需要重点梳理几种主流方案:首先是经典的Vue.prototype挂载,这是官方推荐方式;其次是全局混mixin,适合需要响应式更新的场景;还有vuex状态管理,虽然稍重但更规范;最后提醒module模式这种纯JS方案作为补充。 特别要注意两点:一是全局变量命名规范,建议加$前缀免冲突;二是响应式更新的限制,非vuex方案需要配合Vue.set。用户可能遇到的在于:直接在全局变量赋值不会触发视图更新,这点必须强调。 代码示例要区分选项式API和composition API两种写法。考虑到用户提供过Vue3的setup示例,可以对比展示Vue2的选项式写法。全局混的例子要体现生命周期钩子的使用场景,比如初始化全局变量。 最后补充注意事项时,要强调用原则。全局变量滥用会导致调试困难,这点和用户引用的资料[3]观点一致。插件系统的建议可能超出当前问题范围,但值得提示作为进阶方案。 </think>在 Vue.js 2.x 中,定义全局变量主要有以下几种常用方法: ### 1. 使用 `Vue.prototype` (最常用) 在口文件(通常是 `main.js`)中,将变量挂载到 Vue 的原型链上,所有组件实例可通过 `this` 访问: ```javascript // main.js Vue.prototype.$globalVar = '我是全局变量'; Vue.prototype.$apiBaseUrl = 'https://api.example.com'; ``` **组件内使用:** ```javascript export default { mounted() { console.log(this.$globalVar); // 输出: 我是全局变量 console.log(this.$apiBaseUrl); // 输出: https://api.example.com } } ``` ### 2. 使用全局混 (`Vue.mixin`) 适用于需要为每个组件注**响应式变量**或**方法**的场景: ```javascript // main.js Vue.mixin({ data() { return { $sharedState: { userToken: 'token123', isMobile: false } } } }) ``` **组件内使用:** ```javascript export default { created() { console.log(this.$sharedState.userToken); // token123 } } ``` ### 3. 使用 Vuex 状态管理 (推荐大型项目) 适用于需要**响应式更新**和**集中管理**的全局数据: ```javascript // store/index.js export default new Vuex.Store({ state: { user: { name: 'Alice' }, config: { theme: 'dark' } }, mutations: { setTheme(state, theme) { state.config.theme = theme; } } }) // main.js import store from './store' new Vue({ store }).$mount('#app') ``` **组件内使用:** ```javascript export default { computed: { theme() { return this.$store.state.config.theme; // 响应式获取 } }, methods: { changeTheme() { this.$store.commit('setTheme', 'light'); // 修改状态 } } } ``` ### 4. 独立模块导出 (非响应式) 适合纯工具类变量/函数: ```javascript // globals.js export const APP_VERSION = '2.0.1'; export const formatDate = (date) => { /* 格式化逻辑 */ }; // 组件内使用 import { APP_VERSION, formatDate } from '@/globals'; ``` ### 对比总结 | **方法** | **响应式** | **适用场景** | **组件访问方式** | |--------------------|------------|----------------------------------|----------------------------| | `Vue.prototype` | ❌ | 常量、工具函数 | `this.$var` | | 全局混 (`mixin`) | ✅ | 需要响应式的简单状态 | `this.$sharedState.key` | | **Vuex** | ✅ | 复杂全局状态,需严格管理 | `this.$store.state` | | 独立模块 | ❌ | 工具类常量/函数 | 按需导 | ### ️ 注意事项 1. **命名规范**:`Vue.prototype` 的属性建议以 `$` 开头(如 `$globalVar`),免与组件自有属性冲突。 2. **响应式限制**:直接挂载到 `Vue.prototype` 的非响应式对象修改后不会触发视图更新,需配合 `Vue.set` 或改用 Vuex。 3. **用全局变量**:过度使用可能导致代码耦合,优先考虑 Props/Events 或 Vuex 管理状态[^1][^3]。 4. **类型提示**:若使用 TypeScript,需扩展 `Vue` 接口声明全局属性: ```typescript declare module 'vue/types/vue' { interface Vue { $globalVar: string; } } ``` > 根据项目复杂度选择方案:小型项目用 `Vue.prototype` 或全局混,中大型项目**强烈推荐 Vuex**[^3]。 --- ### 相关问题 1. Vue2 中如何实现全局变量的响应式更新? 2. Vue.prototype 和 Vuex 在管理全局状态时有何本质区别? 3. 如何在 Vue2 项目中优雅地封装全局工具函数? 4. Vue2 全局混 (mixin) 的使用场景和潜在风险有哪些? 5. 如何为 Vue.prototype 添加的全局属性提供 TypeScript 类型支持?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值