Javascript 在react redux应用程序中,状态如何传递给选择器?
我遇到了一个示例,其中mapStateToProps函数正在使用memonization。我只是想知道“state”参数是如何传递给记忆选择器的。在查看了重新选择和redux的文档之后,似乎mapStateToProps可以返回一个接受状态作为参数的函数,而connect decorator可能是将状态传递给它的函数,但不确定。谁能帮我弄点光吗 视图/tracklist/index.jsJavascript 在react redux应用程序中,状态如何传递给选择器?,javascript,reactjs,redux,reselect,Javascript,Reactjs,Redux,Reselect,我遇到了一个示例,其中mapStateToProps函数正在使用memonization。我只是想知道“state”参数是如何传递给记忆选择器的。在查看了重新选择和redux的文档之后,似乎mapStateToProps可以返回一个接受状态作为参数的函数,而connect decorator可能是将状态传递给它的函数,但不确定。谁能帮我弄点光吗 视图/tracklist/index.js const mapStateToProps = createSelector( getBrowserMe
const mapStateToProps = createSelector(
getBrowserMedia,
getPlayerIsPlaying,
getPlayerTrackId,
getCurrentTracklist,
getTracksForCurrentTracklist,
(media, isPlaying, playerTrackId, tracklist, tracks) => ({
displayLoadingIndicator: tracklist.isPending || tracklist.hasNextPage,
isMediaLarge: !!media.large,
isPlaying,
pause: audio.pause,
pauseInfiniteScroll: tracklist.isPending || !tracklist.hasNextPage,
play: audio.play,
selectedTrackId: playerTrackId,
tracklistId: tracklist.id,
tracks
})
);
export default connect(
mapStateToProps,
mapDispatchToProps
)(Tracklist);
export function getCurrentTracklist(state) {
// console.log(state);
let tracklists = getTracklists(state);
return tracklists.get(tracklists.get('currentTracklistId'));
}
export const getTracksForCurrentTracklist = createSelector(
getCurrentPage,
getCurrentTrackIds,
getTracks,
(currentPage, trackIds, tracks) => {
return trackIds
.slice(0, currentPage * TRACKS_PER_PAGE)
.map(id => tracks.get(id));
}
);
core/tracklist/selectors.js
const mapStateToProps = createSelector(
getBrowserMedia,
getPlayerIsPlaying,
getPlayerTrackId,
getCurrentTracklist,
getTracksForCurrentTracklist,
(media, isPlaying, playerTrackId, tracklist, tracks) => ({
displayLoadingIndicator: tracklist.isPending || tracklist.hasNextPage,
isMediaLarge: !!media.large,
isPlaying,
pause: audio.pause,
pauseInfiniteScroll: tracklist.isPending || !tracklist.hasNextPage,
play: audio.play,
selectedTrackId: playerTrackId,
tracklistId: tracklist.id,
tracks
})
);
export default connect(
mapStateToProps,
mapDispatchToProps
)(Tracklist);
export function getCurrentTracklist(state) {
// console.log(state);
let tracklists = getTracklists(state);
return tracklists.get(tracklists.get('currentTracklistId'));
}
export const getTracksForCurrentTracklist = createSelector(
getCurrentPage,
getCurrentTrackIds,
getTracks,
(currentPage, trackIds, tracks) => {
return trackIds
.slice(0, currentPage * TRACKS_PER_PAGE)
.map(id => tracks.get(id));
}
);
当我们使用react-redux中的Connect组件时,状态如何传递给选择器的概述 什么是选择器? 选择器从源中提取数据的子集 让我们把Redux存储看作我们的“前端数据库”。为此,如果要在数据库中提取总数据的子集,请执行查询。以类似的方式,选择器是我们对Redux商店的查询 在最简单的情况下,选择器只能返回整个存储的状态 重新选择文档为我们提供了使用选择器的三大理由
const mapStateToProps = createSelector(
getBrowserMedia,
getPlayerIsPlaying,
getPlayerTrackId,
getCurrentTracklist,
getTracksForCurrentTracklist,
(media, isPlaying, playerTrackId, tracklist, tracks) => ({
displayLoadingIndicator: tracklist.isPending || tracklist.hasNextPage,
isMediaLarge: !!media.large,
isPlaying,
pause: audio.pause,
pauseInfiniteScroll: tracklist.isPending || !tracklist.hasNextPage,
play: audio.play,
selectedTrackId: playerTrackId,
tracklistId: tracklist.id,
tracks
})
);
export default connect(
mapStateToProps,
mapDispatchToProps
)(Tracklist);
export function getCurrentTracklist(state) {
// console.log(state);
let tracklists = getTracklists(state);
return tracklists.get(tracklists.get('currentTracklistId'));
}
export const getTracksForCurrentTracklist = createSelector(
getCurrentPage,
getCurrentTrackIds,
getTracks,
(currentPage, trackIds, tracks) => {
return trackIds
.slice(0, currentPage * TRACKS_PER_PAGE)
.map(id => tracks.get(id));
}
);
- 选择器可以计算派生数据,允许Redux存储 最小可能状态李>
- 选择器是高效的。选择器不可用 除非其中一个参数发生更改,否则将重新计算李>
- 选择器是 可组合。它们可以用作其他选择器的输入
const mapStateToProps = createSelector(
getBrowserMedia,
getPlayerIsPlaying,
getPlayerTrackId,
getCurrentTracklist,
getTracksForCurrentTracklist,
(media, isPlaying, playerTrackId, tracklist, tracks) => ({
displayLoadingIndicator: tracklist.isPending || tracklist.hasNextPage,
isMediaLarge: !!media.large,
isPlaying,
pause: audio.pause,
pauseInfiniteScroll: tracklist.isPending || !tracklist.hasNextPage,
play: audio.play,
selectedTrackId: playerTrackId,
tracklistId: tracklist.id,
tracks
})
);
export default connect(
mapStateToProps,
mapDispatchToProps
)(Tracklist);
export function getCurrentTracklist(state) {
// console.log(state);
let tracklists = getTracklists(state);
return tracklists.get(tracklists.get('currentTracklistId'));
}
export const getTracksForCurrentTracklist = createSelector(
getCurrentPage,
getCurrentTrackIds,
getTracks,
(currentPage, trackIds, tracks) => {
return trackIds
.slice(0, currentPage * TRACKS_PER_PAGE)
.map(id => tracks.get(id));
}
);
在使用重选库时,我们可以像组件一样提供重选选择器道具。这使我们能够跨多个组件共享选择器
假设我们有多个toDo列表,每个列表都有自己的Id。我们仍然会对每个toDo列表实例使用相同的getVisibleTodos选择器,但只是传递一个不同的Id作为道具
但是,问题是createSelector仅在其参数集与其前一组参数相同时返回缓存值
重新选择文档指出,我们可以通过在mapStateToProps中返回函数来克服此限制:
import { getVisibleTodos } from '../selectors'
const mapStateToProps = (state) => {
return {
todos: getVisibleTodos(state)
}
}
为了在多个组件之间共享选择器并保留
记忆化,组件的每个实例
需要选择器自己的私有副本。
如果为connect提供的mapStateToProps参数返回函数
它将用于创建单个对象,而不是对象
MapStateTops函数用于容器的每个实例
通过在MapStateTops中返回一个函数,我们可以克服这个限制,并且可以实现记忆