vue 与 小程序之间的 某些相同处 和不同处

本文对比了Vue和微信小程序在条件渲染、显示隐藏元素、绑定class、事件处理、绑定值和设置值等方面的实现方式,详细介绍了v-if、v-show、wx:if、bindtap等指令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条件渲染

vue:使用v-if指令,v-else表示v-if的else块,v-else-if表示v-if 的“else-if 块”

<div v-if="type === 'A'">
 A
</div>
<div v-else-if="type === 'B'">
 B
</div>
<div v-else-if="type === 'C'">
 C
</div>
<div v-else>
 Not A/B/C
</div>

微信小程序:使用wx:if,wx:else表示wx:if的else块,wx:elif表示wx:if的"else-if"块

<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

显示隐藏元素

vue 中VUE:v-show="..."
小程序中hidden="{{...}}"

绑定class

vue:全用v-bind,或者简写为:bind,和本有的class分开写

<div class="test" v-bind:class="{ active: isActive }"></div>

微信小程序:
<view class="test {{isActive ? 'active':'' }}"></view>

事件处理

VUE:使用v-on:event绑定事件,或者使用@event绑定事件

<button v-on:click="counter += 1">Add 1</button>
<button v-on:click.stop="counter+=1">Add1</button> //阻止事件冒泡

微信小程序:全用bindtap(bind+event),或者catchtap(catch+event)绑定事件

<button bindtap="clickMe">点击我</button>
<button catchtap="clickMe">点击我</button> //阻止事件冒泡

绑定值

VUE:vue动态绑定一个变量的值为元素的某个属性的时候,会在变量前面加上冒号:,例:<img :src="imgSrc"/>
微信小程序:绑定某个变量的值为元素属性时,会用两个大括号括起来。例:<image src="{{imgSrc}}"></image>

设置值

VUE:设置test的值可以用,this.test = true;获取test的值可以用this.test.

微信小程序:设置test的值要用this.setData({test:true});获取test的值用this.data.test

### 如何在不同Vue 组件之间共享相同的 Hook 状态 当我们在多个Vue组件间需要共享状态时,可以考虑几种方案来保证这些组件能同步更新它们所依赖的数据。对于使用Composition API(即hooks)的情况来说,有几种常见且有效的方式可以帮助我们达到这个目标。 #### 1. 使用提供者模式(Provide / Inject) Vue 提供了内置的 `provide` `inject` 功能,在 Composition API 中同样适用。这意味着您可以将一个 hook 封装好之后作为“提供的值”传递给子树内的所有后代组件去注入并消费。 ##### 示例代码 - ParentComponent.vue: ```vue <template> <child-component /> </template> <script setup lang="ts"> import { provide } from 'vue' import useSharedState from './hooks/useSharedState' // 初始化 shared state 并将其暴露出去供其他组件使用 const sharedHookResult = useSharedState() provide('sharedHook', sharedHookResult) </script> ``` ##### 子组件 ChildComponent.vue 内部则可以直接 inject 此 hook 结果: ```vue <template> <!-- 使用来自父级传来的hook --> Value: {{ counter }} <button @click="increment">Increment Counter</button> </template> <script setup lang="ts"> import { inject } from 'vue' import type { SharedHookType } from '../types/shared-hook-type' const sharedHook = inject<SharedHookType>('sharedHook') if (!sharedHook) throw new Error("Unable to find the provided hook") // 解构出我们需要的部分 const { counter, increment } = sharedHook </script> ``` 这种方法适用于父子层级结构明确的情况下,并且不需要引入额外的状态管理库如Vuex等。 #### 2. 利用 Pinia 或 Vuex 进行全局状态管理 如果您正在寻找一种更为通用的方式来管理分发应用范围内的共享状态,则推荐采用专用的状态管理模式工具例如Pinia(Vue3官方首选)或者仍然可以选择经典的Vuex(针对Vue2版本设计但也兼容Vue3). **优点:** - **集中存储**: 所有的状态都集中在单一的地方,便于调试维护。 - **跨级别通信**: 可以很容易地跨越任意层次的关系来进行数据交换。 **缺点:** - 对于小型项目可能会显得过于复杂; - 添加更多间接层可能导致性能损耗; 假设我们要继续沿用前面提到的例子 `useFetchData` ,那么我们可以把它的逻辑迁移到 store 模块里,再通过 mapActions/mapGetters 达成目的。 #### 3. 自定义事件总线(EventBus) 虽然这并不是最现代化的做法,但在某些简单的场景下还是可以用自定义事件机制实现松散耦合的不同组件间的通讯。不过需要注意的是由于缺乏上下文关联容易造成难以追踪的问题,因此建议仅限于小规模非关键业务逻辑理上运用。 --- 综上所述,根据实际需求选择合适的方法至关重要。如果只是想简单快速解决问题并且应用场景比较局限的话,第一种方法已经足够强大;而对于大型单页应用程序(SPA),第二种方式无疑是更好的长期解决方案。当然也有第三种替代选项存在,但它通常不是最优选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值