3.1.1
MAC, ํฌ๋กฌ 63.0.3239.84(64), ๋ฐ 3.1.1
https://ant.design/components/form-cn/#components -form-demo-dynamic-form-item
๋์ ์์ ํญ๋ชฉ ์ค์ ๊ฐ,
` const formItems = keys.map((k, ์ธ๋ฑ์ค) => {
๋ฐํ (
ํ์={์ฐธ}
ํค={k}
>
{getFieldDecorator(์ต์๊ธ์ก-${k}}, {
๊ท์น: [{
ํ์: ์ฌ์ค,
๋ฉ์์ง: "่ฏท่พๅ
ฅๅคงไบ0็ๅผ",
}],
})(
)}
{ (keys.length > 1) ? (
<Button
type="danger"
disabled={keys.length === 1}
onClick={() => this.remove(k)}
>ๅ ้ค</Button>
) : null}
</FormItem>
);
});
Example this.props.form.setFields(
{
"minAmount-1" : {value : 111}
}
);
.
๊ฐ์ ๊ณตํต ํ๋๋ก ์ค์ ํฉ๋๋ค.
๋ฑ๋กํ๊ธฐ ์ ์๋ ํ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
ํ ๋ฐ์ดํฐ๋ฅผ ํธ์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋์ ์์ ํญ๋ชฉ์ผ๋ก ์ค์ ํ ๋.
์๋
ํ์ธ์ @kerrzhao์
๋๋ค. ์ด ๋งํฌ https://u.ant.design/codesandbox-repro ๋ฅผ ๋ถ๊ธฐํ์ฌ ์จ๋ผ์ธ ๋ณต์ ๋ฅผ ์ ๊ณต Need Reproduce
๋ ์ด๋ธ์ด ์ง์ ๋ ๋ฌธ์ ๋ 7์ผ ๋์ ํ๋์ด ์์ผ๋ฉด ๋ซํ๋๋ค.
@yesmeck https://codesandbox.io/s/3rxj27q281 ๋ค์์ ์ฝ๋ ๋ฐ๋ชจ์ ๋๋ค. ์์๋๋ ํจ๊ณผ๋ ๋์ ์์์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
๊ฒฝ๊ณ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฑ๋กํ๊ธฐ ์ ์๋ ํ๋ ๊ฐ์ ์ค์ ํ ์ ์์ผ๋ฉฐ componentDidMount์ names_2
๊ฐ์ ์ค์ ํ๋ฉด ์์ง ๋ฑ๋ก๋์ง ์์ ์ํ์
๋๋ค.
@kerrzhao๋ , ์๋
ํ์ธ์, ์ฐ๋ฆฌ๋ GitHub ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ทธ๋ฅผ ์ถ์ ํ๊ฑฐ๋ Ant Design์ ๊ณํ์ ๋ํด ๋
ผ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์์ ์ฌ์ฉ ์ง๋ฌธ์ ํ์ง ๋ง์ญ์์ค . Stack Overflow ๋๋ Segment Fault ์ ๋ํด ์ง๋ฌธ์ ์๋ํ ๋ค์ antd
๋ฐ react
ํ๊ทธ๋ฅผ ์ง๋ฌธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
setFieldsValue
์ด ๋ฉ์๋๋ฅผ ํธ์ถ form
๋ฑ๋ก๋์ง ์์์ผ๋ฏ๋ก setFields
@kerrzhao setFields
์๋ ํ์ญ์์ค.
๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์์ด๋ก ๋ง ํด์ฃผ์ธ์.
@naefl ๊ฒฝ๊ณ ์์ ๋งํ๋ฏ์ด ํ๋๊ฐ ๋ฑ๋ก๋๊ธฐ ์ ์๋ setFieldsValue
๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
@naefl ๋์ 'setFields'๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์.
@naefl ๋์ initialValue
์ฌ์ฉํ๊ณ ํ๋ ๊ฐ์ state example๋ก ์ค์ ํ ์ ์์ต๋๋ค. https://codesandbox.io/s/3rxj27q281
์ด ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ๋ ๋ฐ์ํ์ง๋ง ๊ตฌ์ฑ ์์๊ฐ React Native์ ์ฒ์ ๋ง์ดํธ๋ ๋๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ด์ํ ์ ์ setFieldValues
๋ ์์์ด ๋ ๋๋ง๋ ํ์์ผ ํธ์ถ๋์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
class Login extends React.Component {
componentDidMount() {
this.getStoredSettings()
}
getStoredSettings = async () => {
const canLogin = await getItem('token')
if (!canLogin) {
const creds = await getItem('credentials')
if (creds) {
// update values with creds
const { email, password } = JSON.parse(creds)
try {
this.props.form.setFieldsValue({
email,
password,
})
} catch (error) {
console.log(error)
}
}
}
}
render() {
const { form, initialValues } = this.props
const { email, password } = initialValues
const { getFieldProps } = form
return (
<Form>
<InputItem
{...getFieldProps('email', {
initialValue: email,
})}
/>
<InputItem
{...getFieldProps('password', {
initialValue: password,
})}
type='password'
/>
</Form>
)
}
}
const LoginForm = createForm()(Login)
const mapState = (state) => {
return {
initialValues: {
email: __DEV__ ? DEFAULT_EMAIL : '',
password: __DEV__ ? DEFAULT_PASSWORD : '',
},
}
}
export default connect(mapState)(LoginForm)
@gitdust ๋ณต์ฉ๋ ํจ๊ณผ๊ฐ ์์ต๋๊น?
@fenghuizhang ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํฉ๋๋ค
์ ์ ์ข์?
const formData = {
name: data.name,
title: data.title,
desc: data.desc,
link: data.link,
};
this.props.form.setFieldsValue(formData);
์๋ง๋ ๊ทํ์ ํ๋์๋ from์ ์๋ ํ๋๊ฐ ์์ต๋๋ค.
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฑ๋กํ๊ธฐ ์ ์๋ ํ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ด์ ๋ ๋ง์นจ๋ด ๋ฐ๊ฒฌ๋์์ต๋๋ค. ์์์ด ์กด์ฌํ์ง ์๋ ํ๋์ ๊ฐ์ ์ค์ ํ์ฌ ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
@yanzishang ์๊ฒ ๊ฐ์ฌ
๋๋ถ๋ถ์ ๋ ์ด๋ธ์ด ์๋ชป๋์์ต๋๋ค.
ํ๋๊ฐ ์ค์ ๋์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ ํ์๋ฉ๋๋ค.
๋ฐ๋ผ์ render()์์ form.getFieldDecorator('fieldName', { initialValue: {} })
์ ๊ฐ์ ์ฒซ ๋ฒ์งธ ํ๋๋ฅผ ์ค์ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ฉ์๋์์ setFieldValue๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค ~
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@kerrzhao๊ฐ ๋งํ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ธ ํ๋ ๊ฐ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Example this.props.form.setFields( { "minAmount-1" : {value : 111} } ); .
ํ๋๊ฐ ์ค์ ๋ฉ๋๋ค. ๋ด๊ฐ fields.hasOwnProperty(myField) ํ๋ฉด true๋ฅผ ๋ฐํํฉ๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ์์์ด ์กด์ฌํ์ง ์๋ ํ๋์ ๊ฐ์ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@guixuefeng101 ๋๋ ๋๊ฐ์
์ค๋ฅ๋ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋งํด์ผ ํฉ๋๋ค.
"๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ํ๋๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ํ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค."
"๋ฑ๋ก"์ ๋ฌธ์ ๊ฐ Ant ํ๋ ์์ํฌ ๋ด๋ถ์ ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฉฐ ์ ๊ฐ๋ฐ์์๊ฒ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
@joeheyming ํด๋น ์ง์นจ์ ๊ฐ์ ํ๊ธฐ ์ํด PR์ ๋ณด๋ผ ์ ์์ต๋๋ค.
@afc163 ์ด ๋ฉ์์ง์ ์์น์ ๋ํ ํฌ์ธํฐ๊ฐ ์์ต๋๊น? ๋๋ ๊ทธ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค
setFields ๋๋ setFieldsValue ๋์ getFieldDecorator์ initialValue ์ฌ์ฉ
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ง๋ง @gitdust ๋๋ถ์ ๊ทํ์ ์๋ฃจ์
์ผ๋ก ๋ด ๋ฌธ์ ๊ฐ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์์ต๋๋ค.
์ด๊ธฐ๊ฐ์ด ๋ค๋ฅธ ์กฐ๊ฑด์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ๊ฐ์ ๋์ ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ์ด๊ธฐ ๊ฐ prop์ ๋ฒ๋ฆฌ๊ณ ๋์ render ๋ฉ์๋ ์ ์ form.setFields๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ฐ์ฌ ํด์!
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด ์์์ ์ค์ ํ ์ ์์ต๋๋ค.
์์ ๊ตฌ์ฑ ์์์๋ A์ B๋ง ์๊ณ ์งํฉ์ ๊ฐ์ฒด์๋ ์ถ๊ฐ C๊ฐ ์์ต๋๋ค.
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ?
@kerrzhao setFieldsValue
์ setState
์ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
this.setState({
addOptionsList: newAddOptionsList
},
() => {
setFieldsValue({
[
${๊ฐ} ]: ''
});
});
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
์์ค์์ค
form.getFieldDecorator('fieldName', { initialValue: your_value })
์๋
๋ค์๊ณผ ๊ฐ์ด v-decorator
ํ์์ผ๋ก ํ๋๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค.
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="description" hasFeedback>
<a-textarea v-decorator="['description']"/>
</a-form-item>
๋ฌธ์๋ ์ด๋ฐ ์ข ๋ฅ์ ์ค์ํ ๋ฉ์์ง์์ ๋ ๋ช ํํ ์ ์์ต๋๋ค.
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
์์ฒญ๋
๋ด ํ๋ ์ด๋ฆ์ด ์์์ ๊ฐ 'astermihagauvlent'๋ก ์ค์ ๋์ด ์๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ํ๋ ์ด๋ฆ์ 'keys'๋ก ๋ณ๊ฒฝํ์ฌ ์์ ํ์ต๋๋ค.
initialValue๋ defaultValue์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒซ ๋ฒ์งธ ๋ ๋๋ง ํ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ด ์ํฉ์์ setFieldValue ๋๋ mapPropsToFields๋ฅผ ์๋ํ์ญ์์ค.
์์:
if(this.props.form.getFieldValue('๋ฒ์ ')){
this.props.form.setFieldsValue({
๋ฒ์ : info.version,
});
}
๋น์ ์ ๋น์ ์ด ๊ฐ์ง๊ณ ์์ง ์์ ํ๋๋ฅผ ์ค์ ํฉ๋๋ค. : )
๋๋ถ๋ถ์ ๋ ์ด๋ธ์ด ์๋ชป๋์์ต๋๋ค.
์ง์ค
@ShMcK ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค, ์ ๋ง ๊ฐ์ฌํฉ๋๋ค ๏ผ๏ผ
getFieldsValue๋ ๊ด์ฐฎ์ต๋๋ค.
setFieldsValue
์ ์ ํ๋๊ฐ ๋ฑ๋ก๋์๋์ง ํ์ธํ์ญ์์ค.
```์๋ฐ์คํฌ๋ฆฝํธ
const { ํ์ } = this.props;
if (์ ์๋์ง ์์ !== form.getFieldValue('foo')) {
form.setFieldsValue({
foo: 'hello world',
});
}
````
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
๊ณ ๋ง์
์ ์๊ฒ ๋ฌธ์ ๋ ์ฌ๋ฌ ํ๋๊ฐ ์๋ ๊ฐ์ฒด๋ก setFieldsValue๋ฅผ ํธ์ถํ ๋ฐ๋ฉด ์ ์์์๋ ํ๋๊ฐ ํ๋๋ฟ์ด์์ต๋๋ค.
๋ค์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
const dataIWantToFillFormWith = { "test1": "dummy data", "test2": "more dummy data" }
Object.keys(form.getFieldsValue()).forEach(key => {
const obj = {};
obj[key] = dataIWantToFillFormWith[key] || null;
setFieldsValue(obj)
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์์ ์กด์ฌํ์ง ์๋ ๋ชจ๋ ํ๋๋ฅผ ๋ฌด์ํฉ๋๋ค.
setFields ๋๋ setFieldsValue ๋์ getFieldDecorator์ initialValue ์ฌ์ฉ
getFieldDecorator์ initialValue๋ฅผ ์ฌ์ฉํ ๋ resetFields๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์๊ฒ ๋ฌธ์ ๋ ์ฌ๋ฌ ํ๋๊ฐ ์๋ ๊ฐ์ฒด๋ก setFieldsValue๋ฅผ ํธ์ถํ ๋ฐ๋ฉด ์ ์์์๋ ํ๋๊ฐ ํ๋๋ฟ์ด์์ต๋๋ค.
๋ค์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
const dataIWantToFillFormWith = { "test1": "dummy data", "test2": "more dummy data" } Object.keys(form.getFieldsValue()).forEach(key => { const obj = {}; obj[key] = dataIWantToFillFormWith[key] || null; setFieldsValue(obj)
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์์ ์กด์ฌํ์ง ์๋ ๋ชจ๋ ํ๋๋ฅผ ๋ฌด์ํฉ๋๋ค.
์ด๊ฒ์ useEffect ํํฌ๋ฅผ ์๋ํ๋ ์ฐ์ฃผ์์ ๋ฐ๊ฒฌ๋ ์ ์ผํ ์๋ฃจ์ ์ด์์ต๋๋ค.
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!
๋น์ ์ ์ฌ๋ํฉ๋๋ค
์ ์๊ฒ๋ ์ฌ๋ฌ ํํ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์ฐพ์ ์ค๋ฅ๋ ์๋ชป๋ ์์ ์ธ์คํด์ค๋ก ์ธํด ๋ฐ์ํ๋ฏ๋ก ํ๋๊ฐ ๋ฑ๋ก๋์์ง๋ง setFieldsValue
๋ฅผ ํตํด ๊ฐ์ ์ค์ ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๋๋ฌด ์ฌํ๋ค|_|
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์์์ ์ค์ ํ ํ๋๊ฐ ์์ผ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค!