react hooks 如何实现类似于中间件那样的调用?

2020-07-02 01:37:15 +08:00
 xiaoming1992
// 希望实现如下的 useMiddleware 函数, 尝试了一下, 发现有点费劲
// 尝试性翻看 react-use, 果然有相似的实现: https://github.com/streamich/react-use/blob/master/docs/useMediatedState.md
// 感觉已经很合用了, 但是好像如下这样的调用方式, 更好看, 更灵活
// 见多识广的大佬能指点一下哪儿是否有类似的实现吗?
// 或者指出我这样调用的弊端?
// 如果实在没有, 可能就得参考 react-use, 硬着头皮自己写了
// 提前感谢大佬们
export function Foo() {
  const [number, setNumber] = useState(1)

  // 这儿能通过类似于中间件那样的语法链式调用, 扩展 setNumber 函数
  const newSetNumber = useMiddleware(setNumber).use((val) => val * 2).use((val) => val - 1).value

  return <button onClick={() => newSetNumber((val) => val + 5)}>
    {number}
  </button>
}
2012 次点击
所在节点    JavaScript
11 条回复
dekuofa
2020-07-02 07:32:35 +08:00
xiaoming1992
2020-07-02 08:21:29 +08:00
@dekuofa 这就看出我的基础不行了,确实,这叫管道更合适一些。但是我希望包内部能处理 useHook 输入参数的差异
phobal
2020-07-02 08:42:59 +08:00
看 taro3 支持类似 jquery 的 chain 式调用,可以去看下他们的实现
ccraohng
2020-07-02 09:09:14 +08:00
要么返回 this 之类的要么返回同样功能的 object,最后 value 实现 get,use 就是把参数加入队列,计算的时候依次求值
dekuofa
2020-07-02 09:15:07 +08:00
@xiaoming1992 不是很明白你的"包内部能处理 useHook 输入参数的差异",这块能展开描述一下吗
StrayBugs
2020-07-02 09:50:38 +08:00
如果能接受 rxjs 的话可以看看 https://observable-hooks.js.org
xiaoming1992
2020-07-02 11:43:17 +08:00
@dekuofa
``` tsx
function Foo() {
__// 这个 setNumber 函数既可以接受 number 类型的参数, 也可以是 (prev: number) => number 函数作为参数, 我希望能像 react-use useMediatedState 那样在函数的内部就把入参的差异给抹掉, 而不是在用的时候再判断
__const [number, setNumber] = useState(1)
// ...
}
```
xiaoming1992
2020-07-02 11:44:01 +08:00
@StrayBugs 说实话,总感觉 rxjs 和 react 不怎么搭...
Qinmei
2020-07-02 15:41:20 +08:00
自己写个 middleware 函数就行了吧,不过前端对于数据的处理确实不多
xiaoming1992
2020-07-02 17:19:04 +08:00
@Qinmei 我的链接中的 react-use 的例子就是非常典型的使用场景,主要是构造那么一个函数有些麻烦。不过今天想了想,还是没用 react-use 的方法,用的 useEffect 监听值的变动,在变动以后当成副作用来作进一步处理。
ericgui
2020-09-01 01:57:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686405

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX