как создать действие onClick в моем компоненте react + Redux

Я прошел через множество учебных пособий и вопросов по стеку, но я не могу найти решение. Я просто изучаю React / redux, пытаясь построить действие OnClick. У меня есть следующая ошибка "Maximum call stack size exceeded error". Я получил это, потому что я рендеринг функции, которая бесконечно меняет мое состояние. Я пытаюсь разобраться со своим <button onClick={DisplayTable(click)}>cool</button> по-другому, но ничего не работает. Я также знаю, что мое действие, и я думаю, что мои редукторы работают правильно, так как я отправляю свое действие через консоль : $r.store.dispatch({type: 'SET_TABLE_DATA'}); мое состояние правильно обновляться.

какие советы ?

вот мои действия :

export const setTableFilter = (click) => {
  return {
    type: 'SET_TABLE_DATA',
    click : click,
  };
};

вот мой редуктор :

const tableFilter = (state = 0, action) => {
    if(action.type === 'SET_TABLE_DATA') {
        return state + 1;
    }
        return state;
  }

и вот мой компонент :

const DisplayTable = (click) => {

        return (
        <div>
            <button onClick={DisplayTable(click)}>cool</button>
        </div> )
    }


function mapStateToProps(state) {
  return {
      click: state.tableFilter.click
  };
};


const mapDispachToProps = (dispatch) => {
    return {
  DisplayTable: (click) => {dispatch (setTableFilter(click));
        },
    };
};

const AppTable = connect(mapStateToProps, mapDispachToProps)(DisplayTable);

export default AppTable;

Я также знаю, что я должен построить свой редуктор таким образом, чтобы мое состояние было обновлено без каких-либо мутаций, однако я сохраню это позже ! :)

спасибо.

2 ответов


данный ответ на самом деле не объясняет почему ваш код не работал, поэтому я решил расширить это.

ваша проблема заключается в том, что вы превышаете стек вызовов функций, более известный как бесконечная рекурсия. Причина этого заключается в том, что вы не передаете функцию в onClick атрибут вашей кнопки, но скорее вызов функция и передача вместо нее возвращаемого значения. Таким образом, следующий сценарий происходит:

  • компонент React монтируется на DOM
  • render() называется
  • на DisplayTable вызывается функция, которая отправляет обновление в магазин
  • магазин обновляет и передает новые реквизиты компоненту React
  • render() еще
  • DisplayTable повторном вызове

...и так далее.

что вы хотите сделать, это передать функцию кнопка


несколько советов, а не полное решение, так как это не поможет вам узнать:

ваше действие и редуктор выглядят нормально. Вы проходите клик свойство которое не использовано в редукторе. Возможно, вы будете использовать его в будущем, но пока это бесполезно.

функция компонента React принимает реквизит в качестве аргумента:

const Comp = props => {
    const click = props.click;
    // ...
};

mapDispatchToProps - это, как правило, не нужен. Вместо этого используйте простые объекты:

connect(state => state.tableFilter, { setTableFilter })(DisplayTable);

затем вы можете получить доступ к функция от реквизита:

<button onClick={() => props.setTableFilter(click)}>cool</button>

помните: onClick принимает функцию!

также состояние, которое вы определили в редукторе, не имеет свойства клик, вместо этого это число (см. правильную функцию mapStateToProps выше)