反应选择器,处理onload状态和onclick

时间:2017-11-02 16:23:43

标签: javascript reactjs redux react-redux reselect

我正在尝试理解选择器与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个选择器而不是进行动作调用,但我不确定...

如果你有一些建议,那就太好了:)

谢谢!

1 个答案:

答案 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”)