#javascript #reactjs
Вопрос:
Здесь я хочу обновить state.value, когда я получаю данные из входных данных, и я использую тег «имя», чтобы найти, какой именно ключ нужно обновить в state.value. Но здесь, в моем коде, я использую крючок useReducer для хранения данных в состоянии в моем пользовательском пользовательском вводе. но проблема, с которой я сталкиваюсь, заключается в том, что я не могу изменить состояние здесь, как вы можете видеть, я получаю данные из функции диспетчера, но я не могу сохранить их в состояние, так как я не могу получить к ним доступ из функции редуктора.
import React from "react";
const reducer = (state, actions) => {
switch (actions.type) {
case "getData":
return {
...state,
value: { ...state.value, [actions.name]: actions.value }, // ****cannot acccess data here
};
default:
return state;
}
};
const useInput = () => {
const defaultValue = {
value: {
fullname: "",
address: "",
pincode: "",
city: "",
phone: "",
},
touch: {
fullname: false,
address: false,
pincode: false,
city: false,
phone: false,
},
};
const [state, dispatcher] = React.useReducer(reducer, defaultValue);
const getData = (e) => {
const name = e.target.name;
const value = e.target.value;
dispatcher({ type: "getData", [name]: value }); // ****heres the dispatcher function
};
// const blurHandler = (e) => {
// dispatcher({ type: "touch", value: true });
// };
console.log(state.value);
return {
getData,
};
};
export default useInput;
Комментарии:
1. что вы видите, когда выполняете действия в журнале консоли ?
2. я получил это, когда я консольно регистрирую действия и печатаю в своей форме ibb.co/SX4nCyJ
3. у тебя в этом проблема ? ваш редуктор ожидает, что действие будет иметь имя и значение, но вместо этого у вас есть полное имя
4. да, но как мне это сделать, когда ключ и значение являются динамическими
Ответ №1:
Попробуйте передать payload
объект, содержащий name
value
свойство и, в функцию отправки:
const getData = (e) => {
const name = e.target.name;
const value = e.target.value;
dispatcher({ type: "getData", payload: { name, value }});
};
Затем вы можете изменить свой редуктор следующим образом, чтобы изменить относительное значение:
const reducer = (state, actions) => {
switch (actions.type) {
case "getData":
return {
...state,
value: { ...state.value, [actions.payload.name]: actions.payload.value },
};
default:
return state;
}
};
Комментарии:
1. большое тебе спасибо. у меня не было такой идеи, тбх. большое спасибо