- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
假设我有一个具有这种状态结构的 redux store:
{
items: {
"id1" : {
foo: "foo1",
bar: "bar1"
},
"id2": {
foo: "foo2",
bar: "bar2"
}
}
}
这家商店通过接收元素的全新值(value)而发展:
const reduceItems = function(items = {}, action) {
if (action.type === 'RECEIVE_ITEM') {
return {
...items,
[action.payload.id]: action.payload,
};
}
return items;
};
我想显示一个 Root View ,它呈现一个 SubItem View 列表,它只提取部分状态。例如 SubItem View 只关心 foos,应该得到它:
function SubItem({ id, foo }) {
return <div key={id}>{foo}</div>
}
因为我只关心状态的“子部分”,所以这就是我想传递给“哑巴” Root View 的内容:
const Root = function({ subitems }) {
// subitems[0] => { id: 'id1', foo: "foo1" }
// subitems[1] => { id; 'id2', foo : "foo2" }
const children = subitems.map(SubItem);
return <div>{children}</div>;
};
我可以很容易地连接这个组件来订阅状态的变化:
function mapStatesToProps(state) {
return {
subitems: xxxSelectSubItems(state)
}
}
return connect(mapStatesToProps)(Root)
我的基本问题是当我不关心的状态部分 (bar
) 发生变化时会发生什么。甚至,当我收到一个项目的新值时,foo
和 bar
都没有改变:
setInterval(() => {
store.dispatch({
type: 'RECEIVE_ITEM',
payload: {
id: 'id1',
foo: 'foo1',
bar: 'bar1',
},
});
}, 1000);
如果我使用“朴素”的选择器实现:
// naive version
function toSubItem(id, item) {
const foo = item.foo;
return { id, foo };
}
function dumbSelectSubItems(state) {
const ids = Object.keys(state.items);
return ids.map(id => {
const item = state.items[id];
return toSubItem(id, item);
});
}
然后列表在每次调用时都是一个全新的对象,我的组件每次都会被渲染,没有任何意义。
当然,如果我使用“常量”选择器,它总是返回相同的列表,因为连接的组件是纯的,它会被重新渲染(但这只是为了说明连接的组件是纯的):
// fully pure implementation
const SUBITEMS = [
{
id: 'id0',
foo: 'foo0',
},
];
function constSelectSubItems(state) {
return SUBITEMS;
}
现在,如果我使用列表发生变化但包含相同元素的“almostConst”版本,这会变得有点棘手。
const SUBITEM = {
id: 'id0',
foo: 'foo0',
};
function almostConstSelectSubItems(state) {
return [SUBITEM];
}
现在,可以预见的是,由于列表不同,即使里面的项目相同,组件也会每秒重新渲染一次。
这是我虽然“重新选择”可以提供帮助的地方,但我想知道我是否没有完全忽略这一点。我可以让 reselect
使用此行为:
const reselectSelectIds = (state, props) => Object.keys(state.items);
const reselectSelectItems = (state, props) => state.items;
const reselectSelectSubItems = createSelector([reSelectIds, reSelectItems], (ids, items) => {
return ids.map(id => toSubItem(id, items));
});
但是它的行为与原始版本完全一样。
所以:
我尝试做的事情可能毫无意义,并且在我的 redux 存储中隐藏了一个问题,所以请随意陈述明显的错误。
最佳答案
您关于新数组引用导致重新呈现和排序选择器在正确轨道上的说法绝对是正确的,但您确实需要改变一些方法。
与其让选择器立即返回 Object.keys(state.item)
,不如处理对象本身:
const selectItems = state => state.items;
const selectSubItems = createSelector(
selectItems,
(items) => {
const ids = Object.keys(items);
return ids.map(id => toSubItem(id, items));
}
);
这样,数组只会在 state.items
对象被替换时重新计算。
除此之外,是的,您可能还想查看连接您的各个列表项组件,以便每个组件都按 ID 查找自己的数据。请参阅我的博文 Practical Redux, Part 6: Connected Lists, Forms, and Performance举些例子。我在Redux Techniques#Selectors and Normalization 也有一堆相关文章。和 Performance#Redux Performance我的 React/Redux links list 的部分.
关于javascript - 你如何使用 `reselect` 来内存一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44305631/
当我将更多选择器组合在一起时,我发现我正在重新排序选择器的定义位置。例如, export const selectNav = state => state.nav; export const sele
我正在尝试将动态参数传递给重新选择选择器。这样做的原因是这个参数实际上是一个事先不知道的角度路线参数。它也不能是国家的一部分。 以下是来自订阅组件的传递路由参数的相关代码: this.store.se
由于一些奇怪的奇怪原因,我的重新选择选择器返回了这个函数: ƒ () { if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, ar
我有一个大型选择器,它遍历数组并为数组中的每个项目调用一个选择器。有什么简单的方法可以解决这个问题吗? 看起来像这样: const memoizedGetPatientSymptomSeries =
我正在尝试集成reselect进入我当前的应用程序,一如既往,首先我开始阅读文档,然后如果需要,再阅读另一个资源。我无法理解文档的一个特殊部分,也找不到可以更清晰地解释的资源。现在我来这里是为了得到一
我有以下选择器: const getAllAddresses = (withStartEnd) => createSelector( [getAllAddressesSelec
假设我有一个具有这种状态结构的 redux store: { items: { "id1" : { foo: "foo1", bar: "bar1" },
编辑:添加了 package.json 摘录 我正在尝试在现有的 React 项目中实现 typescript ,但我遇到了 Reselect 的困难图书馆。 Typescript 编译器坚持导入 c
将 toJS 与重新选择库一起使用时,我在 React 应用程序的选择器中遇到错误。我尝试导入 toJS 以及不导入它,但无论如何我都会收到错误。 nodeCreationWindow.get(...
我正在尝试过滤和显示“postID”与当前帖子 ID 匹配的评论。我正在使用 Redux/Reselect,它可以工作,但有时会返回一个错误,提示 post._id is undefined/null
我尝试为可编辑的 html 元素构建工具栏。我有带有“粗体”、“斜体”等的工具栏。 当用户选择任何文本并单击“粗体”时,我检查是否存在跨度,如果不存在则插入。 let hasWrap = (selec
我最近才遇到过重新选择这样对我来说很新的包。我仔细阅读了官方文档,并且已经对我的第一个 selectors 有了经验。但只有一件事我无法理解 - 在组件中实现 selectors 以创建正确的内存选择
我在我的应用程序中使用了 React + Redux + Reselect + Immutable.js 的终极组合。我喜欢重新选择的想法,因为它让我保持状态(由 reducer 维护)尽可能简单。我
据我所知,用于重新选择的 .d.ts 文件 ( https://github.com/reactjs/reselect ) 是正确的。那么这是怎么回事……是 Typescript 编译器的问题吗?我的
我创建了一个根据用户输入过滤数据的应用程序。 // ui component import React from 'react'; import { useDispatch, useSelector
我已经坚持了一段时间。 这是我的 redux-state 的一部分 state: { teachers: [ { teacherId: 'ttt1', teacherName: 'Susa
我正在尝试了解重新选择方法 createStructuredSelector 在 Typescript 中的工作原理。我经常看到这种模式: export interface SomeProps {
我的应用程序已经有大量供各种容器对象使用的选择器。这些非常适合访问状态的不同部分,并使重构状态变得更加容易。 现在我想在我的一些 reducer 函数中使用我的选择器。问题是在 reducer 内部,
我想使用基于 mapStateToProps 的某些 ownProps 的重新选择来创建一个具有内存功能的选择器。 最佳答案 您可以通过使用 react-redux 提供的 connect 方法将选择
我正在实现 React + Redux 应用程序,但发现将 Reselect 集成到我的应用程序中很困难; 下面是我的代码 store.js import "regenerator-runtime
我是一名优秀的程序员,十分优秀!