Итак, я использую redux и reselect инструмент createSelector
для запоминания моих селекторов в mapStateToProps
, и это здорово.
Теперь у меня есть нормализованные данные в моем хранилище и контейнер, которому нужны взаимозависимые данные из хранилища.
Я делаю это на данный момент, и это работает:
const getItemId = props => parseInt(props.match.params.itemId, 10)
const containerSelector = createSelector(getItemId, itemId =>
createSelector(
[getUser, getItem(itemId)],
(user, item) =>
createSelector(
[
getFoo(item.fooId),
getBar(item.barId)
],
(foo, bar) => ({ user, item, foo, bar })
)
)
)
const mapStateToProps = (state, ownProps) =>
containerSelector(ownProps)(state)(state)
export default connect(mapStateToProps)(Container)
Вопрос: есть ли лучший способ сделать это?
- более читабельно?
- Лучшая практика?
- Более производительный? (это перфоманс?)
Изменить:
Благодаря ответу Тхо Ву, я смог упростить его и запомнить, например:
import { getUser, getItemById, getFooById } from 'selectors'
// Note: getStuffById are selector factories like:
// const getStuffById = id => state => state.stuff.objects[id]
const itemIdSelector = (_, props) => parseInt(props.match.params.itemId, 10)
const itemSelector = (state, props) => {
const itemId = itemIdSelector(state, props)
return getItemById(itemId)(state)
}
const fooSelector = (state, props) => {
const item = itemSelector(state, props)
return item ? getFooById(item.fooId)(state) : null
}
const mapStateToProps = createStructuredSelector({
user: getUser,
itemId: itemIdSelector,
item: itemSelector,
foo: fooSelector
})
Но я все еще смешанный об этом? А может уже хорошо?
getItemById
иgetFooById
, которые кажутся фабриками селекторов (функции, которые возвращают новый, частично настроенный селектор), используемые как обычный селектор. Если это так, было бы еще возможности для улучшения. - person Andrea Carraro   schedule 09.05.2018id
— добавил пояснительный комментарий в пример кода. - person Pandaiolo   schedule 10.05.2018