使用uni-app自定义hooks时渲染模版时数据绑定异常小程序与web均无法响应式

使用uni-app自定义hooks时渲染模版时数据绑定异常小程序与web均无法响应式

项目信息

项目信息 详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows
HBuilderX类型 正式
HBuilderX版本号 4.45
手机系统 iOS
手机系统版本号 iOS 15
手机厂商 苹果
手机机型 iPhone12
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

示例代码:

hooks

import { ref } from "vue"  

const useTest = () => {  
    const flag = ref(false)  
    const changeFlag = () => {  
        flag.value = !flag.value  
    }  
    return {  
        flag,  
        changeFlag  
    }  
}  

export default useTest

页面

<template>  
    <view class="content">  
        <view @click="onChange">改变flag状态</view>  

        <view>页面flag:{{pageFlag}}</view>  
        <view>页面flag表达式:{{pageFlag ? 'yes' : 'no'}}</view>  
        <view>hooks-flag:{{test.flag}}</view>  
        <view>hooks-flag表达式:{{test.flag ? 'yes' : 'no'}}</view>  
    </view>  
</template>  

<script setup>  
import { ref } from "vue"  
import useTest from '../../hooks/useTest';  
const test = useTest()  
const pageFlag = ref(false)  
const onChange = () => {  
    test.changeFlag()  
    pageFlag.value = !pageFlag.value  
}  
</script>  

<style>  
.content{  
    text-align: center;  
}  
</style>

操作步骤:

点击’改变flag状态’文本即可

预期结果:

'hooks-flag表达式’的结果与’页面flag表达式’一致

实际结果:

'页面flag表达式’响应式变化
'hooks-flag表达式’无变化,无法响应式

bug描述:

使用自定义hooks时,在模版里面绑定表达式,则响应式失效,如果使用原值则响应式,查看是编译取值问题。


更多关于使用uni-app自定义hooks时渲染模版时数据绑定异常小程序与web均无法响应式的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

试试 const {flag, changeFlag}= useTest() 这样使用应该是可以的

更多关于使用uni-app自定义hooks时渲染模版时数据绑定异常小程序与web均无法响应式的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的响应式数据在模板中使用的问题。在uni-app的Vue3 setup语法中,当从hooks返回的ref对象在模板中使用时,如果直接使用test.flag,实际上访问的是.value的代理,但在模板表达式中会出现响应式丢失的情况。

解决方案很简单:在模板中使用hooks返回的ref时,需要显式调用.value

<view>hooks-flag:{{test.flag.value}}</view>
<view>hooks-flag表达式:{{test.flag.value ? 'yes' : 'no'}}</view>

或者更好的做法是在setup中解构出flag:

<script setup>
import useTest from '../../hooks/useTest';
const { flag, changeFlag } = useTest()
</script>

<template>
<view>{{flag ? 'yes' : 'no'}}</view>
</template>
回到顶部