You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/** * A hook to access the redux `dispatch` function. * * Note for `redux-thunk` users: the return type of the returned `dispatch` functions for thunks is incorrect. * However, it is possible to get a correctly typed `dispatch` function by creating your own custom hook typed * from the store's dispatch function like this: `const useThunkDispatch = () => useDispatch<typeof store.dispatch>();` * * @returns redux store's `dispatch` function * */exportfunctionuseDispatch<TDispatch=Dispatch<any>>(): TDispatch;exportfunctionuseDispatch<AextendsAction=AnyAction>(): Dispatch<A>;
前言
上一篇文章讲了讲如何结合 Redux Thunk 完成 store 中核心 Todo 切片的状态编写. 由于关于 store 部分已经全部完成了, 这篇主要谈一谈如何使用 React-Redux 结合 React Hooks 来完成 UI 部分
该篇也是本系列最后一篇文章
想跳过文章直接看代码的: 完整代码
最后的效果:
思路
这里我简单就分为三个组件:
App
TodoApp
TodoItem
组件分的多细其实完全看个人偏好, 比如这个项目, 完全可以抽成粒度更细致的, 比如添加 Todo 的输入框可以是单独一个组件, Todo 列表也可以是一个组件, 底下的 Footer 也可以成为一个独立的. 这里为了方便就不抽成很细的了
所有的组件都是用 hooks 编写, 包括 react-redux 部分. 所以关于 class 组件以及相关 react-redux 使用(比如
conntect
) 可能需要自行谷歌了App
先从最基本的开始, 这个组件需要配置一下 Store, 以及引入一下样式:
这里提一下 css, 主要会用 antd 的一些组件, 同时有自定义一些样式, 都在
style.css
文件下, 有兴趣可以自己去查看, 不做深究至此这个组件就写完了. 唯一的作用就是提供一个 store, 所有在该
provider
下的子组件都可以拿到里面的状态, 同时有别于原生的context
, 组件可以根据自己拿到的状态按需重新渲染, 不会出现有部分状态更新之后, 所有组件都重新渲染而造成性能问题.TodoItem
一个
TodoItem
应该具有对应 store 上的如下操作:checkbox
能够进行勾选toogleTodo
todo
todo
的内容, 但是点击可以进行修改更新内容而一个
TodoItem
里面的数据是无法单独在这个这个组件里连接 Redux 获取的(你咋知道你要的 todo 是哪个 todo). 所以正确做法应该是在父组件(也就是TodoApp
) 里面获取数据, 通过 props 传给TodoItem
, 包括对 redux 里面action
操作也是如此代码如下:
TodoApp
核心组件, 需要去 Redux 里面取数据以及对应的 action, 同时初始化的时候要向服务端请求数据, 所以结构可能是这样的:
然而很可惜, 这样很有可能 ts 编译器会报错...直接谷歌了一下发现一个类似的问题: type-safe useDispatch with redux-thunk. 其实原因很简单, 我们现在 Dispatch 的方法不是一个标准的
Action
, 这个Action
是被Thunk
包装过的. 包括我们直接去看一下源码:可以看到源码的注释也非常清晰的解释了如果用到了 Thunk 那么需要自己传入泛型类型
当然包括 React Redux 官网也有写使用套路.
所以我们只需改一下:
后面就没什么好说的了, 要拿数据只需要
useSelector()
,dispatch
一个action
不管是不是Thunk Action
现在类型都不会有问题了. Reac Redux 和 TypeScript 的结合相比原生的 Redux 还是好很多的最后贴一下代码:
总结
最后一篇文章想来想去发现其实没啥好写的, 当然可能是因为我懒了只想罗列代码.
其实我甚至根本没在真实项目里用过 Redux + TypeScript. 这篇文章可以算是我一时兴起的 Demo 文章. 所以完全有可能存在很多错误. 因为很简单, 我连 TypeScript 和 React 都没写过啥项目...而且一个 TodoApp 状态来用 Redux 来管理实在有点大材小用.
讲实话, Redux 和 TypeScript 写起来是真的挺啰嗦的, 而且坑也有一些. 起码我觉得对新手不是特别友好. 有些时候为了一个非常小的类型问题需要大动周折去翻源码搜 issue 实在是有点不值得. 虽然我觉得 Redux 的文档真的已经写的很详细了. 但是有时候过分详细又会让开发者很迷茫手足无措. 写的太多, 反而找不到我想要的东西了的那种感觉
有机会我再去啾啾 Redux Toolkit 这个库吧
参考
The text was updated successfully, but these errors were encountered: