React - 关于复选框和 axios,我做错了什么?
React - What am i doing wrong about checkbox and axios?
看来我对checkboxes/toggle有很大的误解。
我想要做的是,将 checkbox/toggle 的状态从 true 更改为 false 或其他。
axios 请求工作正常。我可以更改任何文本并强制执行。
但是每当涉及到切换一个值时,我都会失败。
它总是以:我可以将值从 false 设置为 true。
但从不从真到假。
我的状态显示正确的值,所以当我单击切换按钮时,它在控制台中显示:true、false、true、false...
但是当我尝试将它发送到服务器并打印时 console.log(req.body.isClosed);在我的后端,只有在从 false 到 true 的情况下,它才会打印“true”。
从 false 到 true 是一个“undefined”
所以你在这里,我从 5 小时开始就尝试修复它。
使用纯复选框,react-multi-switch-toggle 和现在的 mui switch ...
希望有人能帮助我
更新:当我更改 isClosed: isClosed 时? isClosed : settings.isClosed 到
已关闭:已关闭?错误:settings.isClosed
它有效,但前提是我的切换为真。
如果我的按钮状态为 false,它仍会打印 undefined。
所以目前它只能在我的切换状态为真时发送有效的东西。不管我发送什么然后一切正常
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { useSelector, useDispatch } from 'react-redux';
import { systemSettings } from '../../../../../redux/actions/systemSettingsAction';
import Switch from '@mui/material/Switch';
const IsClosed = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(systemSettings());
}, []);
const settingsstate = useSelector((state) => state.systemSettingsReducer);
const { settings } = settingsstate;
const [isClosed, setIsClosed] = useState(
settings[0]?.isClosed === true ? true : false
);
console.log(isClosed);
const handleIsClosed = (event) => {
setIsClosed(event.target.checked);
};
const updateInfor = () => {
try {
axios.patch(
'/api/settings',
{
id: settings[0]?._id,
isClosed: isClosed ? isClosed : settings.isClosed,
}
);
window.location.reload(true);
} catch (err) {}
};
return (
<div>
<Switch
checked={isClosed}
onChange={handleIsClosed}
inputProps={{ 'aria-label': 'controlled' }}
/>
<button
onClick={updateInfor}
className='block w-full bg-yellow-400 hover:bg-yellow-300 p-4 mt-2 rounded text-black hover:text-yellow-800 transition duration-300'
>
Confirm
</button>
</div>
);
};
export default IsClosed;
我认为问题出在这里:
const handleIsClosed = (event) => {
setIsClosed(event.target.checked);
};
你是将开关的当前状态设置为你的isClosed状态,实际逻辑应该是相反的
所以 onChange 你应该切换你的当前状态,你可以这样做:
const handleIsClosed = () => {
setIsClosed(!isClosed);
};
这将采用您当前的 isClosed 状态,并切换它(因此,如果它是 true,它将是 false,反之亦然)
看来我对checkboxes/toggle有很大的误解。 我想要做的是,将 checkbox/toggle 的状态从 true 更改为 false 或其他。
axios 请求工作正常。我可以更改任何文本并强制执行。 但是每当涉及到切换一个值时,我都会失败。 它总是以:我可以将值从 false 设置为 true。 但从不从真到假。
我的状态显示正确的值,所以当我单击切换按钮时,它在控制台中显示:true、false、true、false...
但是当我尝试将它发送到服务器并打印时 console.log(req.body.isClosed);在我的后端,只有在从 false 到 true 的情况下,它才会打印“true”。 从 false 到 true 是一个“undefined”
所以你在这里,我从 5 小时开始就尝试修复它。 使用纯复选框,react-multi-switch-toggle 和现在的 mui switch ... 希望有人能帮助我
更新:当我更改 isClosed: isClosed 时? isClosed : settings.isClosed 到 已关闭:已关闭?错误:settings.isClosed
它有效,但前提是我的切换为真。 如果我的按钮状态为 false,它仍会打印 undefined。 所以目前它只能在我的切换状态为真时发送有效的东西。不管我发送什么然后一切正常
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { useSelector, useDispatch } from 'react-redux';
import { systemSettings } from '../../../../../redux/actions/systemSettingsAction';
import Switch from '@mui/material/Switch';
const IsClosed = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(systemSettings());
}, []);
const settingsstate = useSelector((state) => state.systemSettingsReducer);
const { settings } = settingsstate;
const [isClosed, setIsClosed] = useState(
settings[0]?.isClosed === true ? true : false
);
console.log(isClosed);
const handleIsClosed = (event) => {
setIsClosed(event.target.checked);
};
const updateInfor = () => {
try {
axios.patch(
'/api/settings',
{
id: settings[0]?._id,
isClosed: isClosed ? isClosed : settings.isClosed,
}
);
window.location.reload(true);
} catch (err) {}
};
return (
<div>
<Switch
checked={isClosed}
onChange={handleIsClosed}
inputProps={{ 'aria-label': 'controlled' }}
/>
<button
onClick={updateInfor}
className='block w-full bg-yellow-400 hover:bg-yellow-300 p-4 mt-2 rounded text-black hover:text-yellow-800 transition duration-300'
>
Confirm
</button>
</div>
);
};
export default IsClosed;
我认为问题出在这里:
const handleIsClosed = (event) => {
setIsClosed(event.target.checked);
};
你是将开关的当前状态设置为你的isClosed状态,实际逻辑应该是相反的
所以 onChange 你应该切换你的当前状态,你可以这样做:
const handleIsClosed = () => {
setIsClosed(!isClosed);
};
这将采用您当前的 isClosed 状态,并切换它(因此,如果它是 true,它将是 false,反之亦然)