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 类型支持?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值