首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在function函数组件中编辑表单数据?

如何在function函数组件中编辑表单数据?
EN

Stack Overflow用户
提问于 2021-03-14 18:01:57
回答 1查看 551关注 0票数 0

我试图用useState设置一个表单字段值。

settings.values.apiKey变量有一个值,但是textarea元素是空的。我的useState怎么了

我试图将value={apiKey}更改为value={settings.values.apiKey},然后显示该值,但随后无法更改字段的值。当我尝试输入某物时,它总是显示原始值。

App.js

代码语言:javascript
复制
const App = () => {
    const [apiKey, setApiKey] = useState(settings.values.apiKey)

    useEffect(() => {
        const getSettings = async () => {
            const settingsFromServer = await fetchSettings()
            setSettings(settingsFromServer)
        }

        getSettings()
    }, [])

    const fetchSettings = async () => {
        const res = await fetch('http://127.0.0.1/react-server/get.php')
        return await res.json()
    }

    const saveSettings = async (settings) => {
    }

    return (
        <div className="container">
            <Header />
            <Settings
                settings={settings}
                saveSettings={saveSettings}
            />
            <Footer />
        </div>
    );
}

export default App;

Settings.js:

代码语言:javascript
复制
import { useState } from 'react';

const Settings = ({ settings, saveSettings }) => {
    const [apiKey, setApiKey] = useState(settings.values.apiKey)

    const onSubmit = (e) => {
        e.preventDefault()

        saveSettings({ apiKey})
    }

    return (
        <div>
            <form className='add-form' onSubmit={onSubmit}>
                <div className='form-control'>
                    <label>Api key</label>
                    <textarea
                        value={apiKey}
                        onChange={(e) => setApiKey(e.target.value)}
                    />
                </div>

                <input type='submit' value='Save settings' className='mt15' />
            </form>
        </div>
    )
}

export default Settings

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-14 18:20:39

看起来,您在App.js文件中错误地使用了App.js作为状态变量。它应该被设置所取代。

代码语言:javascript
复制
 const [settings, setSettings] = React.useState();

上面的代码将使value={apiKey}对Settings.js文件中的textarea正常工作。然后,onChange也将开始正常工作。

更新

除了上面提到的错误之外,如果settings道具在Settings.js中没有定义,这可能会导致您的代码在useState上中断。因此,请在useEffect中检查设置值,然后设置该值。代码看起来像这样,或者您可以检查这里的代码框链接用于工作演示

Settings.js

代码语言:javascript
复制
import { useEffect, useState } from "react";

const Settings = ({ settings, saveSettings }) => {
  const [apiKey, setApiKey] = useState();
  useEffect(() => {
    if (settings?.values?.apiKey) {
      setApiKey(settings.values.apiKey);
    }
  }, [settings]);

  const onSubmit = (e) => {
    e.preventDefault();

    saveSettings({ apiKey });
  };

  return (
    <div>
      <form className="add-form" onSubmit={onSubmit}>
        <div className="form-control">
          <label>Api key</label>
          <textarea
            value={apiKey}
            onChange={(e) => setApiKey(e.target.value)}
          />
        </div>

        <input type="submit" value="Save settings" className="mt15" />
      </form>
    </div>
  );
};

export default Settings;

App.js

代码语言:javascript
复制
const [settings, setSettings] = useState()
代码语言:javascript
复制
  const saveSettings = async (settings) => {
      setSettings(settings);
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66627852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档