#reactjs
#reactjs
Вопрос:
Я создаю простое приложение для вычисления матрицы, поскольку для матрицы требуется 9 значений, поэтому мне нужно 9 состояний для хранения значений и цели вычисления
Использование 9 состояний очень длительное, как мне использовать одно состояние и создать внутри него массив и сохранить значение, подобное значению 9 состояний
позволяет использовать 9 состояний, использовать 9 обработчиков для функции onchange
Поскольку значение не может быть нулевым, мы не можем создать пустой массив, например
const [values,setValues] = useState([])
Короче говоря, как мне сократить этот код, как мне использовать циклы для минимизации кода, поскольку для нас важен каждый ввод???????
import React, { useState } from 'react'
function Add() {
const [value1, setValue1] = useState(0)
const [value2, setValue2] = useState(0)
const [value3, setValue3] = useState(0)
const [value4, setValue4] = useState(0)
const [value5, setValue5] = useState(0)
const [value6, setValue6] = useState(0)
const [value7, setValue7] = useState(0)
const [value8, setValue8] = useState(0)
const [value9, setValue9] = useState(0)
const [solution, setSolution] = useState(null)
const changeHandler1 = (e) => {
setValue1(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler2 = (e) => {
setValue2(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler3 = (e) => {
setValue3(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler4 = (e) => {
setValue4(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler5 = (e) => {
setValue5(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler6 = (e) => {
setValue6(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler7 = (e) => {
setValue7(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler8 = (e) => {
setValue8(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const changeHandler9 = (e) => {
setValue9(e.target.value)
console.log("handler", value1, value2, value3, value4, value5, value6, value7, value8, value9)
}
const solveHandler = () => {
let sub1 = value5 * value9 - value8 * value6
let sub2 = value4 * value9 - value7 * value6
let sub3 = value4 * value8 - value5 * value7
let answer = (value1 * sub1) - (value2 * sub2) (value3 * sub3)
setSolution(answer)
}
return (
<div>{console.log("return", value1, value2, value3, value4, value5, value6, value7, value8, value9)}
< input type="text" onChange={changeHandler1} value={value1} />
< input type="text" onChange={changeHandler2} value={value2} />
< input type="text" onChange={changeHandler3} value={value3} />
<br />
< input type="text" onChange={changeHandler4} value={value4} />
< input type="text" onChange={changeHandler5} value={value5} />
< input type="text" onChange={changeHandler6} value={value6} />
<br />
< input type="text" onChange={changeHandler7} value={value7} />
< input type="text" onChange={changeHandler8} value={value8} />
< input type="text" onChange={changeHandler9} value={value9} />
<br />
<br />
<button onClick={solveHandler} >solve</button>
<p>Answer : {solution}</p>
</div>
)
}
export default Add
изменения в вопросе приветствуются!
Ответ №1:
Вместо этого используйте массив. Матрица обычно представлена в виде массива на языках.
function Add() {
const [matrix, setMatrix] = React.useState(Array.from({ length: 8 }).fill(0));
const [solution, setSolution] = useState(null);
return (
<div>
{matrix.map((num, idx) => {
const onChange = e => {
const newMatrix = [...matrix];
newMatrix[idx] = Number(e.target.value);
setMatrix(newMatrix);
};
return <input type="text" onChange={onChange} value={num} />;
})}
<button onClick={solveHandler}>solve</button>
<p>Answer : {solution}</p>
</div>
);
}
Ответ №2:
Вы можете использовать useReducer
hook. Например.
const initialValues = {};
for (let i = 0; i < 9; i ) {
initialValues[i] = 0;
}
const [values, setValues] = useReducer(
(state, newState) => ({ ...state, ...newState }),
initialValues
);
const changeHandler = (e) => {
setValues({ [e.target.name]: e.target.value });
};
return (
<>
{Object.entries(values).map(([k, v]) => (
<input name={k} type="text" onChange={changeHandler} value={v} />
))}
<button onClick={solveHandler}>solve</button>
<p>Answer: {solution}</p>
</>
);
В этом случае useReducer будет работать аналогично setState, обновляя только заданное значение.
Ответ №3:
Я написал такой код.
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [values, setValues] = useState([0, 0, 0, 0, 0, 0, 0, 0, 0]);
const [solution, setSolution] = useState(null);
const handlerFun = (event, index) => {
console.log(index);
console.log(event);
let temp = [...values];
temp[index] = event.target.value;
setValues(temp);
};
const solveHandler = () => {
let sub1 = values[4] * values[8] - values[7] * values[5];
let sub2 = values[3] * values[8] - values[6] * values[6];
let sub3 = values[3] * values[7] - values[4] * values[6];
let answer = values[0] * sub1 - values[1] * sub2 values[2] * sub3;
setSolution(answer);
};
return (
<div className="App">
{values.map((x, index) => {
return (
<>
<div>
{" "}
<input
type="text"
onChange={(event) => {
handlerFun(event, index);
}}
value={x}
/>
</div>
<span> {(index 1) % 3 === 0 ? <br /> : ""}</span>
</>
);
})}
<br />
<br />
<button onClick={solveHandler}>solve</button>
<p>Answer : {solution}</p>
</div>
);
}
Рабочая демонстрация