Javascript 如何在使其可编辑后写入内部输入?
我正在从JSON数据中填充输入字段的值,从后端获得的数据,现在UI上有一个编辑按钮,单击该按钮,我正在启用输入字段,但无法在其中键入,因为我正在设置一些值 我想在我将输入设置为可编辑后在输入中写入Javascript 如何在使其可编辑后写入内部输入?,javascript,reactjs,Javascript,Reactjs,我正在从JSON数据中填充输入字段的值,从后端获得的数据,现在UI上有一个编辑按钮,单击该按钮,我正在启用输入字段,但无法在其中键入,因为我正在设置一些值 我想在我将输入设置为可编辑后在输入中写入 const { register, handleSubmit, errors } = useForm(); const [disabled, setdisabled] = useState(false); const [editBtn, seteditBtn] = useState(true)
const { register, handleSubmit, errors } = useForm();
const [disabled, setdisabled] = useState(false);
const [editBtn, seteditBtn] = useState(true);
<form onSubmit={handleSubmit(onSubmit)}>
{editBtn === true && (
<div align="right">
<button
className="btn white_color_btn"
type="button"
onClick={edit}
>
Edit
</button>
</div>
)}
{editBtn === false && (
<button className="btn white_color_btn" type="submit">
Save
</button>
)}
<div className="row">
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
disable
id="firstName"
name="firstName"
value={dataItems.firstname}
disabled={disabled ? "" : "disabled"}
ref={register({ required: true })}
/>
{errors.firstname && (
<span className="text-danger">first name required</span>
)}
<br />
<label htmlFor="emp_designation">First name</label>
</div>
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
disabled
id="lastname"
name="lastname"
value={dataItems.lastname}
disabled={disabled ? "" : "disabled"}
ref={register({ required: true })}
/>
{errors.lastname && (
<span className="text-danger">last name required</span>
)}
<br />
<label htmlFor="lastname">Lastname</label>
</div>
</div>
</form>
您的输入由您给它的值控制。ie:其值始终是例如
empData.item.name
并且您没有提供变更处理程序来处理变更
尝试添加如下内容:
function myChangeHandler(e){
setEditedValueSomeHow(e.target.value);
}
<input
// ...
onChange={myChangeHandler}
/>
下面是一个您需要将输入作为一个受控组件,并编写onChange处理程序来更新状态。这将允许您编辑输入字段值
const[disabled,setdisabled]=useState(false);
const[name,setName]=useState(empData.item.name)//设置默认名称
const[lastname,setLastname]=useState(empData.item.lastname)//默认lastname
常量编辑=()=>{
setdisabled(true);
};
返回(
编辑
{
setName(例如target.value)
}}
disabled={disabled?”:“disabled”}
/>
名称
{
setLastname(e.target.value)
}}
disabled={disabled?”:“disabled”}
/>
姓氏
);
为了使输入可编辑,您需要更新控制输入值的本地状态。正如您在评论中所建议的,您正在使用graphql获取数据,您可以使用useEffect将数据设置为状态,然后单击edit,更新localState
export default function App() {
const { register, handleSubmit, errors } = useForm();
const [disabled, setdisabled] = useState(true);
const [editBtn, seteditBtn] = useState(true);
const { loading, data } = useQuery("some qraphql query here"); // getting data from graphql
const [formData, setFormData] = useState({});
useEffect(() => {
setFormData(data);
}, [data]);
const edit = () => {
setdisabled(false);
seteditBtn(false);
};
const onSubmit = () => {
console.log(formData);
// submit data using formData state.
};
const handleChange = e => {
const name = e.target.name;
const value = e.target.value;
console.log(name, value);
setFormData(prev => ({ ...prev, [name]: value }));
};
return (
<div className="container-fluid">
<form onSubmit={handleSubmit(onSubmit)}>
{editBtn === true && (
<div align="right">
<button
className="btn white_color_btn"
type="button"
onClick={edit}
>
Edit
</button>
</div>
)}
{editBtn === false && (
<button className="btn white_color_btn" type="submit">
Save
</button>
)}
<div className="row">
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
id="firstname"
name="firstname"
onChange={handleChange}
value={formData.firstname}
disabled={disabled}
ref={register({ required: true })}
/>
{errors.firstname && (
<span className="text-danger">first name required</span>
)}
<br />
<label htmlFor="emp_designation">First name</label>
</div>
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
id="lastname"
name="lastname"
value={formData.lastname}
onChange={handleChange}
disabled={disabled}
ref={register({ required: true })}
/>
{errors.lastname && (
<span className="text-danger">last name required</span>
)}
<br />
<label htmlFor="lastname">Lastname</label>
</div>
</div>
</form>
</div>
);
}
导出默认函数App(){
常量{register,handleSubmit,errors}=useForm();
const[disabled,setdisabled]=使用状态(true);
const[editBtn,seteditBtn]=useState(true);
const{loading,data}=useQuery(“此处的某些qraphql查询”);//从graphql获取数据
const[formData,setFormData]=useState({});
useffect(()=>{
setFormData(数据);
},[数据];
常量编辑=()=>{
setdisabled(假);
seteditBtn(假);
};
const onSubmit=()=>{
console.log(formData);
//使用formData状态提交数据。
};
常量handleChange=e=>{
const name=e.target.name;
常量值=e.target.value;
console.log(名称、值);
setFormData(prev=>({…prev[name]:value}));
};
返回(
{editBtn===true&&(
编辑
)}
{editBtn===false&&(
拯救
)}
{errors.firstname&&(
需要名字
)}
名字
{errors.lastname&&(
需要姓氏
)}
姓氏
);
}
我无法最初提供状态,因为我在顶层使用钩子定义我的状态,而我的数据在此之后出现,所以不能这样做。等一下,我将使用代码和框链接编辑我的帖子。这对我没有帮助,因为我必须在顶层定义useForm钩子,而我的数据随后出现,对于mor澄清,我使用
react apollo graphql
获取数据,因此我必须先检查错误并加载,然后我获取数据,因此如果我在使用表单中初始化数据,它将是未定义的,或者如果我在加载和出错后定义我的使用表单,它将抛出错误作为react钩子“useForm”如果你有两个选择:1。编写自己的表单管理。2.将两个组件分开:一个包含错误和初始状态(未加载),另一个包含数据时:(我只能这样做,谷歌会四处搜索并找到一些东西吗?我得到了你的答案,我只能这样做,但我想澄清一件事,现在你在使用表单中插入使用默认值的valies,但那时我没有数据,所以我可以使用useffect
所以当从后台(API)加载数据时然后我可以在useForm中传递值,请在我理解这个情况并且我不知道react-hook表单是否提供了一种改变值的必要方式时进行指导,我建议您使用两个组件:-NodeDataComponent和WithDataComponent,WithDataComponent使用从道具接收的默认值初始化useForm。我认为避免更改初始化的useForm值的方法当您声明要从后端获取值时,您是否实际进行API调用以获取同一组件或另一组件中的数据。此外,单击“提交”后,您将需要将数据提交到后端,并且仍保持正确的格式状态?@ShubhamKhatri yup I am ge正在检查同一组件中是否允许用户编辑来自后端的数据,然后仅显示编辑按钮,然后单击使其更改保存,单击保存时是要将数据保存到服务器(后端)@ShubhamKhatri我正在使用graphql
获取API,在graphql中提交时,有一个方法refetchQueries
,我将通过该方法运行查询,该查询将填充数据,并用最新的更改填充我的UI。请在相应的查询中添加一个答案。考虑到逻辑基本上是错误的,如果您需要更多帮助,请告诉我由你如何获取数据决定,提供一个codesandbox有点棘手。但我肯定可以添加一个模拟演示。但是帖子中的上述代码应该足以让你编辑你的原始代码。我得到了它,不需要显示演示,现在useEffect将解决我所遇到的困难,让我用我真正的API测试一下。我添加了一个模拟演示在任何情况下,在你的原始代码沙盒中都有某些输入错误。用useEffect逻辑更新了它嘿,你在那里,我有一个
const { register, handleSubmit, errors } = useForm({
defaultValues: {
firstName: "steve",
lastname: "smith"
}
});
const [disabled, setdisabled] = useState(false);
const [name, setName] = useState(empData.item.name) // setting default name
const [lastname, setLastname] = useState(empData.item.lastname) // default lastname
const edit = () => {
setdisabled(true);
};
return (<div className="container-fluid">
<div align="right">
<button className="btn" onClick={edit}>
Edit
</button>
</div>
<div className="row">
<div>
<input
type="text"
disable
id="item.value"
value={name}
onChange={(e) => {
setName(e.target.value)
}}
disabled={disabled ? "" : "disabled"}
/>
<br />
<label htmlFor="name">Name</label>
</div>
<div>
<input
type="text"
disabled
id={"lastname"}
value={lastname}
onChange={(e) => {
setLastname(e.target.value)
}}
disabled={disabled ? "" : "disabled"}
/>
<br />
<label htmlFor="lastname">Lastname</label>
</div>
</div>
</div>);
export default function App() {
const { register, handleSubmit, errors } = useForm();
const [disabled, setdisabled] = useState(true);
const [editBtn, seteditBtn] = useState(true);
const { loading, data } = useQuery("some qraphql query here"); // getting data from graphql
const [formData, setFormData] = useState({});
useEffect(() => {
setFormData(data);
}, [data]);
const edit = () => {
setdisabled(false);
seteditBtn(false);
};
const onSubmit = () => {
console.log(formData);
// submit data using formData state.
};
const handleChange = e => {
const name = e.target.name;
const value = e.target.value;
console.log(name, value);
setFormData(prev => ({ ...prev, [name]: value }));
};
return (
<div className="container-fluid">
<form onSubmit={handleSubmit(onSubmit)}>
{editBtn === true && (
<div align="right">
<button
className="btn white_color_btn"
type="button"
onClick={edit}
>
Edit
</button>
</div>
)}
{editBtn === false && (
<button className="btn white_color_btn" type="submit">
Save
</button>
)}
<div className="row">
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
id="firstname"
name="firstname"
onChange={handleChange}
value={formData.firstname}
disabled={disabled}
ref={register({ required: true })}
/>
{errors.firstname && (
<span className="text-danger">first name required</span>
)}
<br />
<label htmlFor="emp_designation">First name</label>
</div>
<div className="form-group col-6 col-sm-6 col-md-6 col-lg-4 col-xl-4">
<input
type="text"
id="lastname"
name="lastname"
value={formData.lastname}
onChange={handleChange}
disabled={disabled}
ref={register({ required: true })}
/>
{errors.lastname && (
<span className="text-danger">last name required</span>
)}
<br />
<label htmlFor="lastname">Lastname</label>
</div>
</div>
</form>
</div>
);
}