reactjs - 如何在单击另一个单选按钮时将单选按钮的值发送到状态并更改值
问题描述
我正在尝试将组件中选定的单个按钮的值推入页面上的状态,以便在选择另一个无线电按钮时,它会以新选择的值更新状态中的值。
问题是,每当我更改选定的单选按钮时,它都会添加一个新值而不是更新它。
这是我的页面
import React, { useContext, useState, useEffect } from 'react';
import { Form, Button, Popconfirm, Icon, Input, Radio, Collapse, Checkbox } from 'antd';
import Axios from 'axios';
import CompanyContext from '../util/UserContext';
import renderEmpty from 'antd/lib/config-provider/renderEmpty';
import InputOnly from '../components/InputOnly';
import CustomInput from '../components/Input';
import Lampiran from '../components/Lampiran';
import CustomCheckBox from '../components/CheckBox';
export default function Hitung() {
let [loading, setLoading] = useState(false);
let [form, setForm] = useState([]);
let [soal, setSoal] = useState([]);
let [pilihan, setPilihan] = useState([]);
let [test, setTest] = useState([1, 2, 3, 4, 5]);
let [answer, setAnswer] = useState("");
let [coba, setCoba] = useState([]);
let [coba2, setCoba2] = useState([]);
const company = useContext(CompanyContext);
let answertemp = []
useEffect(() => {
async function getData() {
try {
let data = await Axios.get('http://localhost:5000/lelang/getquestion');
setSoal(data.data.pertanyaan);
}
catch (e) {
console.log(e);
}
}
getData();
}, []);
function onAnswer(data) {
answertemp.push(data);
console.log(answertemp);
}
function RenderQuestion() {
if (soal.length != 0) {
return soal.map(data => {
switch (data.type_question) {
case "input":
return (<CustomInput data={data} onAnswer={onAnswer} />)
case "input_only":
return (<InputOnly data={data} onAnswer={answer => {
if(coba.length!=0){
for(let i =0;i<coba.length;i++){
if (coba[i].id_question===answer.id_question){
coba[i].answer=answer.answer;
break;
}
else if (i<coba.length-1){
continue;
}
else{
setCoba([...coba,answer])
}
}
}
else{
console.log('add');
setCoba([...coba,answer])
}
}} />)
case "lampiran":
return (<Lampiran data={data} onAnswer={onAnswer} />)
case "checkbox":
return (<CustomCheckBox data={data} onAnswer={onAnswer} />)
}
})
}
else {
return (<h2 style={{ textAlign: "center" }}>Loading....</h2>)
}
}
//insert_answer
async function submit(e) {
setAnswer(answertemp)
setLoading(true);
e.preventDefault();
try {
const token = await Axios.post('http://localhost:5000/lelang/insert_answer', company.data);
}
catch (e) {
alert("error " + e)
}
setLoading(false);
}
return (
<div>
<h1 style={{ textAlign: 'center' }}>Input Penilaian {company.data}</h1>
<div style={{ padding: '30px' }}>
<Form>
{RenderQuestion()}
<button onClick={() => console.log(coba)}>Simpan</button>
</Form>
</div>
</div>
);
}
这是组件
import React, { useContext, useState, useEffect } from 'react';
import { Radio, Input, Form } from 'antd';
export default function CustomInput (props){
let[radioInput,setRadioInput]=useState({});
let[chooseInput, setChooseInput] = useState();
useEffect(()=>{
setRadioInput(props.data);
},[]);
return (
<div>
<p style={{fontWeight:"bold"}}>{radioInput.question}</p>
<Form.Item required>
<Radio.Group
options = {radioInput.variable}
onChange={(data) => props.onAnswer(data.target.value)}
onClick={data => props.onAnswer(data.radioInput.value)}
>
</Radio.Group>
</Form.Item>
</div>
)
}
解决方案
您需要传递有效的依赖项以监听更改。在依赖项中发送空数组时,挂钩只会在第一次渲染时发生。在您的情况下,将使用效果更改为
useEffect(()=>{
setRadioInput(props.data);
},[props.data]);
推荐阅读
- c# - Blazor - IHttpClientFactory.CreateClient 上的“指定转换无效”
- powershell - 如何在 New-PSDrive 中使用 -Path:Powershell 网络驱动器
- bash - 使用 bash,从文件中读取每一行并将其写入以逗号分隔的变量
- python - 使用 Tensorflow 对象检测 API 创建的模型进行对象检测时,CNN 的图像输入大小是多少?
- wordpress - Wordpress - 重写分页 URL 以使用参数而不是漂亮的永久链接
- csv - 将 SAS 文件导出为 CSV
- node.js - 如何添加服务器端图像渲染支持
- visual-studio-code - 如何在visual studio代码中替换多个单词
- python - 如何正确对齐我的字符串?在蟒蛇
- winforms - 在 dotNetBrowser 中监听回调