【问题标题】:Why React component infinitely updated为什么 React 组件会无限更新
【发布时间】:2020-04-10 12:13:13
【问题描述】:

我有一个非常简单的组件,但由于某种原因它无限更新更新。除了反应更新组件,我什么都没有改变。为什么?

我的行动:

export function getMouseMenuButtons() {

    const a = {
        bold: {
            id: 1,
            name: 'bold',
            children: {
                bold: {
                    id: 1,
                    name: 'bold',
                },
                calendar: {
                    id: 2,
                    name: 'calendar'
                },
            }
        },
    }

    return {
        type: MOUSE_MENU_BUTTONS_GET,
        payload: a
    }
}

我的减速机:

export default function (state={}, action: any) {
    switch (action.type) {
        case MOUSE_MENU_BUTTONS_GET:
            return {...state, map: action.payload};
        default: return state;
    }
}

还有我的组件

const MenuCircles = (props: Props) => {


    useEffect(() => {
        props.dispatch(getMouseMenuButtons())
    }, [props.buttons]);




    return (
        <React.Fragment>
            dfdf
        </React.Fragment>
    );
};

function mapStateToProps(state: State) {
    const buttons = state.mouseMenu && state.mouseMenu.map;

    return { buttons };
}

export default connect(mapStateToProps)(MenuCircles);

为什么它总是更新。在 useEffect 中,我检查 props.buttons。他们总是一样的

【问题讨论】:

  • 这意味着你的reducer在每次调度动作时在mouseMenu中组成新数组。 useEffect 通过引用检查依赖关系,因此它在每次重新渲染时都是新的。
  • 谢谢。添加了减速器代码,这是标准的。如何解决重启问题?

标签: javascript reactjs redux use-effect


【解决方案1】:

因此,由于您正在构建引用的新对象并在 reducer 中无条件地添加它,因此您每次运行都会获得全新的 state.mouseMenu

解决此问题的最简单方法是将对象声明移出操作创建者:

const defaultButtons = {
    bold: {
        id: 1,
        name: 'bold',
        children: {
            bold: {
                id: 1,
                name: 'bold',
            },
            calendar: {
                id: 2,
                name: 'calendar'
            },
        }
    },
};
export function getMouseMenuButtons() {
    return {
        type: MOUSE_MENU_BUTTONS_GET,
        payload: defaultButtons
    }
}

这样,您将在分派操作后引用相同的按钮设置。

【讨论】:

  • 但是如果我从一个真实的 API 中获取数据,我会采取行动。那该怎么办呢?
  • 那么你的代码对我来说没有意义。如果某些数据已更改以加载完全相同的数据,为什么我们需要等待?如果它不是一种“重置为初始”,那么我们可能需要将其他一些东西放入依赖项(我不知道,可能是一些id?)
  • 在这个组件中,我经常更改属性(其他,而不是按钮),因此它会经常呈现,但我只想从 api 中提取一次数据。我希望 useEffect 只工作一次,而不是每个渲染器都使用 api。还是我的概念有误?
  • 调用 API - 它依赖什么? call 真的没有依赖关系吗?
  • 然后将 [] 作为依赖项传递
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多