Давайте посмотрим, что у нас есть компонент Form
:
//...
const formsReducer = (forms = {}, action) => {
switch (action.type) {
case "CREATE_FORM" : {
const { id, inputIds } = action;
return {
...forms,
[id]: inputIds.reduce((inputs, inputId) => {
inputs[inputId] = "";
return inputs;
}, {})
};
};
default : return forms
};
};
//...
import React, { useEffect } from "react";
import { connect } from "react-redux";
const createForm = (id, inputIds) => ({
type: "CREATE_FORM",
id,
inputIds
})
const Form = ({
id,
inputs,
onSubmit,
createForm,
getState //!!
}) => {
useEffect(() => {
createForm(id, inputs.map(({ inputId }) => inputId))
}, []);
submit = () => {
const inputValues = getState().forms[id];
onSubmit(inputValues);
};
return (
<div className="form">
{inputs.map(props => <Input {...props} />)
<button onClick={submit}>Submit</button>
</div>
)
};
const mapDispatchToProps = { createForm };
export default connect(null, mapDispatchToProps)(Form);
Где входы отправляют свои значения в хранилище избыточностей.То, что я хочу заработать, - это не излишне перерисовывать компонент Form
, но он должен знать входные значения при отправке.Приведенный выше пример с getState
может быть хорошим решением, но, во-первых, я не знаю каких-либо возможных решений для его реализации.
Во-вторых, он получит все состояние избыточности (что не очень хорошо для производительности).Я думал о том, чтобы отправить событие с помощью кнопки отправки (например, он устанавливает state.forms[formId].submit = true
, прослушивать его и вводить значения с Form
по mapStateToProps
, но установить React.memo
наи передайте shouldComponentUpdate = (prev, next) => prev.submit !== next.submit
в качестве второго аргумента.
Таким образом Form
просто обновится, если получит «зеленый свет», и если submit
истинно, то просто вызовет onSubmit
с входными значениями из mapStateToProps
. И третье решение в моем уме - сделать кнопку компонентом и прослушивать каждое изменение в форме. Повторная визуализация кнопки не так дорога, как повторная визуализация всей формы каждый раз.будет наиболее эффективным решением для этого сценария?