我正在尝试理解选择器与ReSelect的反应,现在可以,但我觉得我的逻辑有问题。
1 - 在ajax请求之后,我得到一个“类别”列表,其中包含id,name和selected
2 - 我正在使用此列表创建标签,当我单击其中一个时,它会将此参数更改为“已选择”(true / false)。
3 - 每个“类别”都是“产品”,我可以通过下拉列表进行选择。
好的,直到现在一切都运转良好。 onChange from my dropdown,我更新我的“产品”状态:
{fetching: false, items: [], selected: {}}
import {
createSelector
} from 'reselect';
const getSelectedProduct = state => state.products.selected;
const getCategories = state => state.categories;
export const filterByProducts = () => {
return createSelector(
getSelectedProduct,
getCategories,
(mp, categories) => {
if (mp && typeof mp === 'object') {
const mpCategories = mp.categories.split(',');
categories.items.map(item => {
item.selected = mpCategories.indexOf(item.id) >= 0;
return item;
});
}
return categories;
}
)
}
当我更改我的产品时,它会更新每个选定的类别,这就是我想要的。 但是onClick到标签,我也更新类别状态:
export const selectCategory = category => {
return (dispatch, getState) => {
const state = getState();
if (state.categories) {
let categories = state.categories.items;
categories.map(item => {
if (item.id === category) {
item.selected = !item.selected;
}
return item;
});
dispatch(receiveCategories(categories));
}
}
}
代码正在运行,但由于我更改了onClick状态,选择器将循环遍历每个类别并且make再次匹配,但我想避免这种情况。
onChange产品,选择器将执行(好) onClick类别,由于我的action.js中的新状态,选择器将运行另一次(不好)。
我正在考虑合并2个选择器而不是进行动作调用,但我不确定...
如果你有一些建议,那就太好了:)
谢谢!
答案 0 :(得分:0)
好的,所以我找到了一些简单的东西。
我在我的“类别”操作中创建了一个名为“selection”的新var来处理我的选择(onclick标签)。
我没有看state.categories,而是只看state.categories.items,所以我的“filterByProduct”每次都不会更新。
然后我创建了一个名为'updateSelectedCategories'的新选择器,它正在观看'filterByProduct'和state.categories.selection。
因此,当我更改我的产品时,'filterByProduct'和'updateSelectedCategories'将会更新。 当我更改类别时,只有'updateSelectedCategories'会更新,所以我不喜欢我以前的匹配。
这里是代码:
import requests
import html
r = requests.get(“http://cricapi.com/api/cricket”)
if r.status_code == 200:
currentMatches = r.json()[“data”]
for match in currentMatches:
print(html.unescape(match[“title”]))
else:
print(“Error in retrieving the current cricket matches”)