Redux 技巧之更方便地從 Store 中獲取 state

在使用 React + Redux 的項(xiàng)目中,從 Store 中獲取 state 一般采用下面的方式:

import React from 'react'
import { connect } from 'react-redux'

let App = ({ firstName, lastName }) => (
  <div>{ firstName } { lastName }</div>
)

App = connect(state => ({
  firstName: state.firstName,
  lastName: state.lastName,
}))(App)

上面例子中,我們從 Store 獲取到了 firstNamelastName 兩個(gè)字段的值。假如考慮需要獲取更多字段的情況:

App = connect(state => ({
  firstName: state.firstName,
  lastName: state.lastName,
  birthday: state.birthday,
  gender: state.gender,
  address: state.address,
  postcode: state.postcode,
  country: state.country,
  // ...
}))(App)

代碼顯得很羅嗦,而且相對(duì)而言變得不容易維護(hù)(曾不止一次碰到過(guò)字段名給拼錯(cuò)的情況,結(jié)果又得花時(shí)間去查找問(wèn)題)。

lodash 提供了一個(gè)叫做 pick 的方法,它的用法如下:

import pick from 'lodash/pick'

const object = { 
  a: 42, 
  b: true, 
  foo: 'bar',
}
pick(object, [ 'a', 'b' ]) // => { a: 42, b: true }

pick 的作用是,從一個(gè)對(duì)象里“取出”指定的鍵名的值。恰好可以把它用在這個(gè)場(chǎng)景里:

App = connect(state => pick(state, [
  'firstName',
  'lastName',
  'birthday',
  'gender',
  'address',
  'postcode',
  'country',
  // ...
])(App)

這樣看過(guò)去代碼瞬間變得干凈了很多……

還可以讓它變得更簡(jiǎn)潔:

import pick from 'lodash/fp/pick' // 注意這里,用的是 FP 版本的 pick

App = connect(pick([
  'firstName',
  'lastName',
  'birthday',
  'gender',
  'address',
  'postcode',
  'country',
  // ...
])(App)

FP 版本的 pick 采用 Pointfree 風(fēng)格,被處理的數(shù)據(jù)作為最后一個(gè)變量傳入。由于同時(shí)是一個(gè)柯里化函數(shù)(Curried Function),我們只傳入部分參數(shù),剩下的參數(shù)留待真正調(diào)用時(shí)傳入,這樣就不用再聲明一個(gè)函數(shù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容