helux icon indicating copy to clipboard operation
helux copied to clipboard

使用中感到难受疑惑的点

Open itmanyong opened this issue 4 years ago • 6 comments

实例中的computed及watch由于签名为字符串数组,是否可以支持props呢,在使用setup中又想监听某些props的变化,而这个限制貌似只有将监听通过内置hook写在组件内部,给人一种很不优雅的感觉。本质上都是监听,却又要通过组件内部来触发settings更新state达到效果。 虽然对于模块的状态在实例中监听可能会多次触发,但某些情况下的衍生数据对于写入模块显得有些小题大做。 理想状态: computed监听state、props、refComputed、moduleState、moduleComputed watch监听state、props、refComputed、moduleState、moduleComputed

itmanyong avatar Nov 02 '21 03:11 itmanyong

收到建议,这块会重新考虑下更优雅的方式

fantasticsoul avatar Nov 02 '21 06:11 fantasticsoul

那就等待魂大的好消息了

itmanyong avatar Nov 02 '21 13:11 itmanyong

那就等待魂大的好消息了

其实有个api effectProps 满足观察props变化的需求,忘了在文档里写了,已经补上了,你可以看下

https://concentjs.github.io/concent-doc/api/ref-effect-props

fantasticsoul avatar Nov 07 '21 06:11 fantasticsoul

那个等待魂大的好消息了

effectProps最近有api满足观察道具变化的需求,互联网文档里写了,已经补上了,你可以看下

https://concentjs.github.io/concent-doc/api/ref-effect-props

可以,很nice。其实有一点不明白为什么依赖值必须是字符串,而不是和useEffect一样的引用设计

itmanyong avatar Nov 07 '21 15:11 itmanyong

因为,useEffect 可以在函数组件每次一次渲染时都能被触发执行,只需要将相关依赖的最新值交给react即可,react内部会去和上一次记录的值做比较然后决定要不要执行effect cb,而 setup 函数里的所有逻辑只能执行一次,ctx.effectProps 方法的第二位参数负责传递字符串,然后 concent 内部通过字符串去取上一次props和最新props的值一一做比较然后决定要不要执行,如果像 useEffect那样传值的话是没有意义的啦(重点需要理解setup 函数里的所有逻辑只能执行一次这句话哈),不过下一个版本可以升级下 ctx.effectProps 函数,支持写

ctx.effectProps( effectCb, isPropsEqualCb ) 这样的方式,既可以让用户自己定制比较规则了,举例:

ctx.effectProps(()=>{
  console.log(' triggerd! ');
}, ( prevProps, currProps )=>{
   return prevProps.someKey !== currProps.someKey
})

fantasticsoul avatar Nov 08 '21 00:11 fantasticsoul

因为,useEffect 可以在函数组件每次一次渲染时都能被触发执行,只需要将相关依赖的最新值交给react即可,react内部会去和上一次记录的值做比较然后决定要不要执行effect cb,而 setup 函数里的所有逻辑只能执行一次,ctx.effectProps 方法的第二位参数负责传递字符串,然后 concent 内部通过字符串去取上一次props和最新props的值一一做比较然后决定要不要执行,如果像 useEffect那样传值的话是没有意义的啦(重点需要理解setup 函数里的所有逻辑只能执行一次这句话哈),不过下一个版本可以升级下 ctx.effectProps 函数,支持写

ctx.effectProps( effectCb, isPropsEqualCb ) 这样的方式,既可以让用户自己定制比较规则了,举例:

ctx.effectProps(()=>{
  console.log(' triggerd! ');
}, ( prevProps, currProps )=>{
   return prevProps.someKey !== currProps.someKey
})

这个方式算是普天同庆了。最具个性化的方式了。最初也猜想是为了不重复触发。只是觉得多个不同类的状态不方便聚合effect。例如一个effect的depkeys由state和props共同触发。有没有一种写法可以支持这样方式呢!如同sync的path将depkeys的值path化!!

itmanyong avatar Nov 08 '21 03:11 itmanyong

这个issue先关闭了,后续有时间实现这个特性,可以关注helux,一个更先进的react 状态管理实现

fantasticsoul avatar Nov 17 '23 08:11 fantasticsoul