• react-refetch的使用小例子


    出处:《react设计模式和最佳实践》
    作者:米凯莱·贝尔托利
    出版时间:2018年8月第1版(还算新)

    使用react-refetch来简化api获取数据的代码

    
    const List = ({data: gists}) => {
      return (
        <ul>
          {gists.map(gist => (
            <li key={gist.id}>{gist.description}</li>
          ))}
        </ul>
      )
    }
    
    const withData = url => Part => {
      return class extends Component {
        state = {data: []}
    
        componentDidMount() {
          fetch(url)
            .then(response => response.json ? response.json() : response)
            .then(data => this.setState({data}))
        }
    
        render() {
          return <Part {...this.state} {...this.props} />
        }
      }
    }
    
    const ListWithGists = withData('https://api.github.com/users/gaearon/gists')(List)
    

    上面的代码,我们将api获取数据的逻辑用高阶组件抽离出来,下面我们再用react-refetch来简化上面的异步代码

    
    import { connect as refetchConnect } from 'react-refetch'
    
    const List = ({gists}) => {
      if (gists.pending) {
        return <div>loading...</div>
      } else if (gists.rejected) {
        return <div>{gists.reason}</div>
      } else if (gists.fulfilled) {
        return (
          gists.fulfilled && <ul>
            {gists.value.map(gist => (
              <li key={gist.id}>{gist.description}</li>
            ))}
          </ul>
        )
      }
    }
    
    const ListWithGists = refetchConnect(() => ({gists: `https://api.github.com/users/gaearon/gists`}))(List)
    

    瞬间清爽多了,顺便利用react-refetch提供的属性,顺便把loading逻辑也添加了

    分离列表和项目的职责

    很明显,List组件是一个渲染列表的组件,他的职责就是渲染列表,但是我们在这里也处理了单个Item的逻辑,我们可以将其进行职责分离,List只做列表染,而Gist也只渲染自身

    
    const Gist = ({description}) => (
      <li>
        {description}
      </li>
    )
    
    const List = ({gists}) => {
      if (gists.pending) {
        return <div>loading...</div>
      } else if (gists.rejected) {
        return <div>{gists.reason}</div>
      } else if (gists.fulfilled) {
        return (
          gists.fulfilled && <ul>
            {gists.value.map(gist => <Gist key={gist.id} {...gist} />)}
          </ul>
        )
      }
    }
    

    使用react-refetch来给Gist添加功能

    react-refetch的connect方法接收一个函数作为参数,这个函数返回一个对象,如果结果对象的值是一个字符串,那么获取prop后,会对这个字符串发起请求,但是如果值是一个函数,那么不会立即执行,而是会传递给组件,以便后续使用

    
    值为字符串
    const connectWithStar = refetchConnect(() => ({gists: `https://api.github.com/users/gaearon/gists`}))
    
    值为函数
    const connectWithStar = refetchConnect(({id}) => ({
      star: () => ({
        starResponse: {
          url: `https://api.github.com/gists/${id}/star?${token}`,
          method: 'PUT'
        }
      })
    }))
    
    const Gist = ({description, star}) => (
      <li>
        {description}
        <button onClick={star}>+1</button>
      </li>
    )
    
    加工Gist组件,star函数会被传递给Gist的prop,然后就可以在Gist里面使用了
    connectWithStar(Gist)
    

    来源:https://segmentfault.com/a/1190000018151481

  • 相关阅读:
    一些基础的前端技术面试问题
    HTTP与HTTPS区别
    XML与JSON
    js的内置对象
    二分法查找
    img下面的留白解决
    大家好
    HEOI2020游记
    CSP-S2019游记
    省选模拟八十六 题解
  • 原文地址:https://www.cnblogs.com/qixidi/p/10390745.html
Copyright © 2020-2023  润新知