阅读 119

redux 现在使用Hooks,之前和现在的对比

原文:Redux Now Has Hooks. A Before and After Comparison

今天react-redux团队发布了7.1.0版本,react-redux新增了钩子!这里有一个快速的比较应该怎样改写你的组件。 首先,简要概述的新函数

  • useSelector:通过一个函数让state作为一个入参然后返回一个value。用于从state中获取一个值。它可以作为mapStateToProps的替代
  • useDispatch: 返回一个dispatch对象的引用,它可以作为mapDispatchToProps替代
  • useStore :返回store的实例。一般不推荐

旧的例子:一个搜索表单

一个示例组件包含stores查询和提交查询,我想使这个示例尽量简单,所以你可以想象一下,它的结果。

import React from 'react'
import { connect } from 'react-redux'
const defaultSearchBar = ({ query, updateQuery, handleSearch }) => {
  const handleSubmit = (e) => {
    e.preventDefault()
    handleSearch(query)
  }
  const handleChange = e => updateQuery(e.target.value)
  return (
    <form onSubmit={handleSubmit}>
      <input
        name="search"
        value={query}
        onChange={handleChange}
      />
    </form>
  )
}
const mapStateToProps = state => ({
  query: state.query,
})
const mapDispatchToProps = dispatch => ({
  updateQuery: newQuery => dispatch({ type: 'UPDATE_QUERY', payload: newQuery }),
  handleSearch: newSearch => dispatch({ type: 'NEW_SEARCH', payload: newSearch }),
})
const connectedSearchBar = connect(
  mapStateToProps,
  mapDispatchToProps,
)(defaultSearchBar)
复制代码

新的组件

在我们新的例子中,有一些不同之处:我们完全不使用了connect,mapStateToProps, mapDispatchToProps这三个函数,这意味着我们的组件不再直接接受props,现在,我们的形式是这样的:

import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
const hookedSearchBar = () => {
  const dispatch = useDispatch()
  const query = useSelector(state => state.query)
  const handleSubmit = (e) => {
    e.preventDefault()
    dispatch({ type: 'NEW_SEARCH', payload: query })
  }
  const handleChange = e => dispatch({ type: 'UPDATE_QUERY', payload: e.target.value })
  return (
    <form onSubmit={handleSubmit}>
      <input
        name="search"
        value={query}
        onChange={handleChange}
      />
    </form>
  )
}
复制代码

创建自己的hooks

如果你的代码组件之间频繁使用(我理解是频繁调用),您可以创建一个hooks,将所有的功能结合在一起. 这里有个例子,我们单独把redux 特殊的部分形成自己的hooks

你应该使用开关吗?

能够创建上面的钩子是非常有趣的,但是我也担心,它可能会使代码难以测试。为测试这些组件已经危险。我不是推销的形式,但我希望这对你比较更容易对代码库做出明智的决定

关注下面的标签,发现更多相似文章
评论