【发布时间】:2021-12-21 14:53:25
【问题描述】:
由于某种原因,在我的代码中,每当我单击取消按钮时,disableAccount 按钮的 onClick 事件就会被激活。所以 cancel 将 isEditMode 设置为 false,但 disableAccount 将其设置回 true,从而阻止我在 UI 中看到任何明显的变化。这是一个 next.js 项目。
import React from 'react';
import TextInput from '../Input/TextInput';
import SmallButton from '../Buttons/SmallButton';
const DisableAccountForm = ({t, tc, onSubmit, password, setPassword, isEditMode, setIsEditMode}) => {
return (
<label className="block w-full max-w-xl text-2xl mb-4">
{t("admin")}
<form onSubmit={onSubmit} className="w-full max-w-xl text-base mt-2">
<p className="mb-4">
{t("disableP")}
</p>
{isEditMode ?
<div>
<p className="mb-4">
{t("youSureP")}
</p>
<p className="text-sm mb-4">
{t("enterPasswordP")}
</p>
</div>
: null
}
{isEditMode ?
<label className="flex-col">
{tc("password")}
<TextInput
placeholder={tc("password")}
value={password}
onChange={e=>setPassword(e.target.value)}
style="m-1"
required
/>
<SmallButton
type="submit"
label={tc("submit")}
color='bg-blue-500'
textColor='text-white'
/>
<SmallButton
type="button"
label={tc("cancel")}
color='bg-red-500'
textColor='text-white'
onClick={() => {console.log("cancel"); setIsEditMode(false)}}
/>
</label>
:
<SmallButton
type="button"
label={t("disableAccount")}
color='bg-blue-500'
textColor='text-white'
onClick={() => {console.log("why"); setIsEditMode(true)}}
/>
}
</form>
</label>
);
}
export default DisableAccountForm;
这是上面代码的控制器。
import React, {useState} from 'react';
import DisableAccountForm from '../components/DisableAccountForm/DisableAccountForm';
const DisableAccountController = ({t, tc, onSubmit}) => {
const [password, setPassword] = useState("");
const [isEditMode, setIsEditMode] = useState(false);
const disableAccount = (e) => {
e.preventDefault();
console.log("disableAccount");
setIsEditMode(false);
}
return (
<DisableAccountForm
t={t}
tc={tc}
onSubmit={disableAccount}
password={password}
setPassword={setPassword}
isEditMode={isEditMode}
setIsEditMode={setIsEditMode}
/>
);
}
export default DisableAccountController;
小按钮
import React from 'react';
const SmallButton = ({type, label, color, textColor, style, onClick}) => {
return (
<button
type={type}
className={`m-1 ${color} hover:ring-2 rounded-md px-2 py-1 min-w-20 ${textColor} ${style}`}
onClick={onClick}
>
{label}
</button>
);
}
export default SmallButton;
【问题讨论】:
-
你能显示
<SmallButton>的代码吗?它实际上是否将type传递给底层<button>元素?type在 HTML 中的默认值是"submit",这将使表单内的任何按钮都提交它,除非该类型设置正确。 -
我在上面添加了 SmallButton 代码
-
尝试将两个
SmallButton组件移出密码<label>元素。 -
当我将 smallButtons 移出
-
我创建了一个代码沙盒,代码为codesandbox.io/s/react-playground-forked-sm6vl?file=/…,取消按钮不会按预期恢复到点击时的原始视图。您可以在那里查看日志,似乎由于某种原因 disableButtons 单击事件正在触发。不知道为什么
标签: reactjs react-hooks next.js