V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ooo4  ›  全部回复第 1 页 / 共 5 页
回复总数  81
1  2  3  4  5  
@zhengfan2016 因为 setup 函数不是副作用,所以不会重新执行,那么 toRefs 的数据在没有其他副作用的情况下,是不会改变的
如果保持你的代码,那么只能改渲染函数了,让他尽量的像 react
```
// Comp.js 不是 sfc
import { watchEffect, onMounted, toRefs, ref } from 'vue';

export default {
setup() {
let data = ref()
onMounted(() => {
setTimeout(() => {
data.value = { code: 0, data: [666, 777, 888] }
}, 1000)
})

return () => {
// 渲染函数 这是副作用,当响应式数据改变了,就会重新执行
const { data: list } = toRefs(data.value) || {}
watchEffect(() => {
console.log('list', list?.value)
})
// jsx
return 1
}
}
}
```
toRefs 的参数必须是一个对象才行,而且必须还要存在属性,因为它要把对应的属性值变成 ref 。
而现在使用的是 ref 包裹数据,那么也应该是`const {data:list} = toRefs(data.value)`才行,让 list 变成了响应式数据,
但是是通过`data.value = { code: 0, data: [666, 777, 888] }`改变数据,也只是改变了 data(ref),list 并没有改变,所以 list 还是以前的数据,如果这样`Object.assign(data.value, { code: 0, data: [666, 777, 888] })`修改数据应该可以

看错了 [如果对 ref 包装的 obj 进行解构]
```
import { reactive, watchEffect, onMounted, toRefs, ref } from 'vue';
const data = ref({ code: null, data: [] })
onMounted(() => {
setTimeout(() => {
Object.assign(data.value, { code: 0, data: [666, 777, 888] })
}, 1000)
})

debugger
const { data: list } = toRefs(data.value)
watchEffect(() => {
console.log('list', list.value)
})
```
@ooo4
不需要这么麻烦
```
import { reactive, watchEffect, onMounted, toRefs } from 'vue';
const data = reactive({ code: null, data: [] })
onMounted(() => {
setTimeout(() => {
Object.assign(data, { code: 0, data: [666, 777, 888] })
}, 1000)
})


const { data: list } = toRefs(data)
watchEffect(() => {
console.log('list', list.value.length)
})
```
试试这个

const data = reactive({ code: null, data: [] })
onMounted(() => {
setTimeout(() => {
Object.assign(data, { code: 0, data: [666, 777, 888] })
}, 1000)
})

function useFoo(state) {
const res = {}
watchEffect(() => {
for (let key in state) {
res[key] = toRef(state, key)
}
})
return res
}

const { data: list } = useFoo(data)

watchEffect(() => {
console.log('data', data)
console.log('list', list)
})
@zhengfan2016 因为我在调试 react 源码,不想通过合成事件去触发,徒增额外调试
@shintendo 从 chrome 的 debugger 工具看,这个 props 确实是来源于闭包,thanks!!
@maclanelf134 那不至于,主要是嫌弃公司的垃圾项目,不想维护
@Liam1997 项目没写过,但 react 的官网看过几次,可以用一个很简单的 demo 打断点一步一步的调试,再看看那些大佬总结的笔记,调试过十几次自然就看的进去了,不过也就简单了解下核心流程
@tog vue 技术栈,但公司的 vue2 老项目太恶心了基本改不动,为什么突然想换了,因为想涨工资了
@llsquaer 我也是这样,一直按着 shift 很累
因为 react 很火,nextjs 也很火
crud 启动
150 天前
回复了 liuchengfeng1 创建的主题 git 各位大佬你们团队开发 git 是如何管理的?
@gorvey 这个肯定要统一 eslint 或者 prettier 的配置文件
170 天前
回复了 netabare 创建的主题 程序员 发现自己的 commit 标题和内容越来越长了
@tyrantZhao 不是自己项目,真不想弄那么细
179 天前
回复了 nanxiaonan 创建的主题 问与答 LOL 比赛热度
早就不看了,没意思
188 天前
回复了 lstz 创建的主题 程序员 在 2024,程序员群体还很抠门吗?(理性探讨)
扣,买个电脑都会看个几年
只会写后台管理系统,全部用 div 和 span
193 天前
回复了 ooo4 创建的主题 Vue.js 这个 x 为什么是 true?看不懂了
@xiyan00 下面是 debug 的 watch 功能输出各项的值
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2827 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 09:20 · PVG 17:20 · LAX 01:20 · JFK 04:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.