未调用 Redux 选择器
Redux Selector not called
我有以下情况:
我的应用状态中国家/地区列表的选择器
export const getCountries = state => state.countries;
以及使用 reselect 创建的选择器以过滤具有特定 ID 的国家/地区
export const getCountryById = countryId =>
createSelector(
[getCountries],
(countries) => {
let countriesList = countries.filter(c => c.id === countryId);
if ( countriesList ) {
return countriesList[0];
}
return null;
}
)
然后有一个国家详细信息页面组件(通过 http://localhost:3000/country/4 访问)
import React from 'react';
import { getCountryById } from '../redux/selectors';
import { connect } from 'react-redux';
const CountryPage = ({country}) => {
return <h1>{country.name}</h1>
}
const mapStateToProps = (state, ownProps) => {
console.log(ownProps.match.params.countryId);
const obj = {
country: getCountryById(ownProps.match.params.countryId)
}
return obj;
};
export default connect(mapStateToProps, null)(CountryPage);
mapStateToProps 正在正确接收 countryId,但未调用选择器。我在这里错过了什么?
还是选择器的使用方法不对?我知道我可以使用 CountryPage 中各州的完整国家/地区列表并在那里进行过滤,但这里的最佳做法是什么?
那是因为您的 getCountryById
实际上不是选择器。 returns选择器是一个函数。
鉴于您正在尝试为每个组件使用唯一 ID 并进行过滤,您可能需要使用 the "factory function" form of mapState
to create a unique selector instance per component instance 来获得正确的记忆行为。
不过,话虽如此,您的选择器也可以简化。你在这里不需要 filter()
,你需要 find()
,这意味着它也不是真正需要记忆的东西。这可以简化为:
const getCountryById = createSelector(
[getCountries, (state, id) => id],
(countries, id) => countries.find(c => c.id === id) || null
)
然后用作:
const mapStateToProps = (state, ownProps) => {
return {
country: getCountryById(state, ownProps.match.params.countryId)
}
};
我有以下情况:
我的应用状态中国家/地区列表的选择器
export const getCountries = state => state.countries;
以及使用 reselect 创建的选择器以过滤具有特定 ID 的国家/地区
export const getCountryById = countryId =>
createSelector(
[getCountries],
(countries) => {
let countriesList = countries.filter(c => c.id === countryId);
if ( countriesList ) {
return countriesList[0];
}
return null;
}
)
然后有一个国家详细信息页面组件(通过 http://localhost:3000/country/4 访问)
import React from 'react';
import { getCountryById } from '../redux/selectors';
import { connect } from 'react-redux';
const CountryPage = ({country}) => {
return <h1>{country.name}</h1>
}
const mapStateToProps = (state, ownProps) => {
console.log(ownProps.match.params.countryId);
const obj = {
country: getCountryById(ownProps.match.params.countryId)
}
return obj;
};
export default connect(mapStateToProps, null)(CountryPage);
mapStateToProps 正在正确接收 countryId,但未调用选择器。我在这里错过了什么?
还是选择器的使用方法不对?我知道我可以使用 CountryPage 中各州的完整国家/地区列表并在那里进行过滤,但这里的最佳做法是什么?
那是因为您的 getCountryById
实际上不是选择器。 returns选择器是一个函数。
鉴于您正在尝试为每个组件使用唯一 ID 并进行过滤,您可能需要使用 the "factory function" form of mapState
to create a unique selector instance per component instance 来获得正确的记忆行为。
不过,话虽如此,您的选择器也可以简化。你在这里不需要 filter()
,你需要 find()
,这意味着它也不是真正需要记忆的东西。这可以简化为:
const getCountryById = createSelector(
[getCountries, (state, id) => id],
(countries, id) => countries.find(c => c.id === id) || null
)
然后用作:
const mapStateToProps = (state, ownProps) => {
return {
country: getCountryById(state, ownProps.match.params.countryId)
}
};