React 表单值未在表单提交时显示
React form values not being displayed on form submission
假设我有一些属性可以等于一些可能的选项。我将在 someConstants.js
中定义它们
const possibleOptions = [
{key: '1', text: "some text 1", value: "some_text_1"},
{key: '2', text: "some text 2", value: "some_text_2"},
];
const someProperties = {
flags: []
};
export { someProperties, possibleOptions };
我希望 someProperties.flags
在提交表格 someForm.js
后由 possibleOptions
更新
import React from "react";
import { someProperties, possibleOptions } from "./someConstants";
import { Form } from "semantic-ui-react";
import "./styles.css";
class SomeForm extends React.Component {
state = someProperties;
handleSubmit = event => {
event.preventDefault();
this.props.onSubmit(this.state);
};
onChange = event => {
const {
target: { name, value }
} = event;
this.setState({
[name]: value
});
};
render() {
return (
<Form onSubmit={this.handleSubmit} onChange={this.onChange}>
<Form.Dropdown
label="Flags"
placeholder="Flags"
name="flags"
fluid
multiple
search
selection
options={possibleOptions}
/>
<Form.Button type="submit">Submit</Form.Button>
</Form>
);
}
}
export { SomeForm };
这些值将按showFlags.js
显示
import React from "react";
import "./styles.css";
class ShowFlags extends React.Component {
displayList = list => {
return(
<ol>
{list.map(flag => (
<li key={flag}>{flag}</li>
))}
</ol>
);
}
render() {
return (
<div>
{this.props.flagProps.flags}
</div>
);
}
}
export { ShowFlags };
这些 类 的相互作用可以在 index.js
中进一步显示
import React from "react";
import ReactDOM from "react-dom";
import { SomeForm } from "./someForm";
import { ShowFlags } from "./showFlags";
class App extends React.Component {
state = {
flagProps: {},
submitted: false
};
handleSubmit = fields => {
this.setState({
flagProps: { ...fields },
submitted: true
});
console.log("handleSubmit flagProps:" + this.state.flagProps);
};
render() {
return (
<>
<div className="Section">
<div className="Title">flagProps form</div>
<SomeForm flagProps={this.state.flagProps} onSubmit={this.handleSubmit} />
</div>
<div className="Section">
<div className="Title">The result</div>
{this.state.submitted ? (
<ShowFlags flagProps={this.state.flagProps} />
) : (
<div>Appears on submission.</div>
)}
</div>
</>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
我怎样才能做到这一点?总结:
当前行为
我可以选择选项,但提交表单不会产生任何显示。 ShowFlags.render()
什么都不显示。
期望的行为
我可以选择选项,这些选项会在提交表单后由 ShowFlags.render()
显示。
如果重要的话,这是使用语义-ui。
这是您的固定代码:
onChange = (event, data) => {
this.setState({
[data.name]: data.value
});
};
render() {
return (
<Form onSubmit={this.handleSubmit}>
<Form.Dropdown
label="Flags"
placeholder="Flags"
name="flags"
fluid
multiple
search
selection
options={possibleOptions}
value={this.state.flags}
onChange={this.onChange}
/>
<Form.Button type="submit">Submit</Form.Button>
</Form>
);
}
https://codesandbox.io/s/exciting-kare-31l7w?file=/src/SomeForm.jsx
您忘记将 onChange
处理程序应用到 SomeForm
中的 Form.Dropdown
,尽管 semantic-ui-react 的工作方式是更改处理程序具有props 作为 change 函数的第二个参数传递给他们。那么新值将是 data.value
.
您还应该将 Form.Dropdown
的值设置为 value={this.state.flags}
,这样它就是一个完全受控的组件,因为您无论如何都要将其置于状态。
我还删除了表单的 onChange 处理程序,因为它根本不影响下拉列表。 Semantic UI React (SUI) 没有在他们的 Form 的 Props 中列出。
在表单上有一个 onChange 处理程序是 html 属性 而不是 SUI 道具。这可以解释为什么它不适用于下拉菜单。因为它们没有正常的 input/select html 元素基础。这也意味着普通 SUI 的 onChange 处理程序的数据参数将不存在,因此您需要直接从元素中获取属性。
Entire form onChange 有一个表单 onChange 处理程序的示例,对于任何具有通常出现在表单中的基本元素的东西来说,它看起来非常强大。
基本 html 元素为:输入、select 和文本区域。
假设我有一些属性可以等于一些可能的选项。我将在 someConstants.js
中定义它们const possibleOptions = [
{key: '1', text: "some text 1", value: "some_text_1"},
{key: '2', text: "some text 2", value: "some_text_2"},
];
const someProperties = {
flags: []
};
export { someProperties, possibleOptions };
我希望 someProperties.flags
在提交表格 someForm.js
possibleOptions
更新
import React from "react";
import { someProperties, possibleOptions } from "./someConstants";
import { Form } from "semantic-ui-react";
import "./styles.css";
class SomeForm extends React.Component {
state = someProperties;
handleSubmit = event => {
event.preventDefault();
this.props.onSubmit(this.state);
};
onChange = event => {
const {
target: { name, value }
} = event;
this.setState({
[name]: value
});
};
render() {
return (
<Form onSubmit={this.handleSubmit} onChange={this.onChange}>
<Form.Dropdown
label="Flags"
placeholder="Flags"
name="flags"
fluid
multiple
search
selection
options={possibleOptions}
/>
<Form.Button type="submit">Submit</Form.Button>
</Form>
);
}
}
export { SomeForm };
这些值将按showFlags.js
显示import React from "react";
import "./styles.css";
class ShowFlags extends React.Component {
displayList = list => {
return(
<ol>
{list.map(flag => (
<li key={flag}>{flag}</li>
))}
</ol>
);
}
render() {
return (
<div>
{this.props.flagProps.flags}
</div>
);
}
}
export { ShowFlags };
这些 类 的相互作用可以在 index.js
中进一步显示import React from "react";
import ReactDOM from "react-dom";
import { SomeForm } from "./someForm";
import { ShowFlags } from "./showFlags";
class App extends React.Component {
state = {
flagProps: {},
submitted: false
};
handleSubmit = fields => {
this.setState({
flagProps: { ...fields },
submitted: true
});
console.log("handleSubmit flagProps:" + this.state.flagProps);
};
render() {
return (
<>
<div className="Section">
<div className="Title">flagProps form</div>
<SomeForm flagProps={this.state.flagProps} onSubmit={this.handleSubmit} />
</div>
<div className="Section">
<div className="Title">The result</div>
{this.state.submitted ? (
<ShowFlags flagProps={this.state.flagProps} />
) : (
<div>Appears on submission.</div>
)}
</div>
</>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
我怎样才能做到这一点?总结:
当前行为
我可以选择选项,但提交表单不会产生任何显示。 ShowFlags.render()
什么都不显示。
期望的行为
我可以选择选项,这些选项会在提交表单后由 ShowFlags.render()
显示。
如果重要的话,这是使用语义-ui。
这是您的固定代码:
onChange = (event, data) => {
this.setState({
[data.name]: data.value
});
};
render() {
return (
<Form onSubmit={this.handleSubmit}>
<Form.Dropdown
label="Flags"
placeholder="Flags"
name="flags"
fluid
multiple
search
selection
options={possibleOptions}
value={this.state.flags}
onChange={this.onChange}
/>
<Form.Button type="submit">Submit</Form.Button>
</Form>
);
}
https://codesandbox.io/s/exciting-kare-31l7w?file=/src/SomeForm.jsx
您忘记将 onChange
处理程序应用到 SomeForm
中的 Form.Dropdown
,尽管 semantic-ui-react 的工作方式是更改处理程序具有props 作为 change 函数的第二个参数传递给他们。那么新值将是 data.value
.
您还应该将 Form.Dropdown
的值设置为 value={this.state.flags}
,这样它就是一个完全受控的组件,因为您无论如何都要将其置于状态。
我还删除了表单的 onChange 处理程序,因为它根本不影响下拉列表。 Semantic UI React (SUI) 没有在他们的 Form 的 Props 中列出。
在表单上有一个 onChange 处理程序是 html 属性 而不是 SUI 道具。这可以解释为什么它不适用于下拉菜单。因为它们没有正常的 input/select html 元素基础。这也意味着普通 SUI 的 onChange 处理程序的数据参数将不存在,因此您需要直接从元素中获取属性。
Entire form onChange 有一个表单 onChange 处理程序的示例,对于任何具有通常出现在表单中的基本元素的东西来说,它看起来非常强大。
基本 html 元素为:输入、select 和文本区域。