如何使用 State Hook 在 React 中编写语义 UI 广播组?

IT技术 javascript reactjs radio-group
2021-04-30 03:44:08

我正在尝试使用 React 中的语义 UI 编写一个单选按钮组。我可以让语义 UIRadio 页面上的 Radio Group 示例工作。它是通过扩展编写的Component我想写同样的事情,将 React 组件定义为函数而不是类并使用state hook我不能让它工作。

我修改了这个例子,看起来像这样。

import React, {useState} from 'react'
import {Form, Radio} from 'semantic-ui-react'


export const RadioExampleRadioGroup = () => {
    const [value, setValue] = useState({});
    const handleChange = event => setValue({value: event.target.value});

    return (
        <Form>
            <Form.Field>
                Selected value: <b>{value.value}</b>
            </Form.Field>
            <Form.Field>
                <Radio
                    label='Choose this'
                    name='radioGroup'
                    value='this'
                    checked={value.value === 'this'}
                    onChange={handleChange}
                />
            </Form.Field>
            <Form.Field>
                <Radio
                    label='Or that'
                    name='radioGroup'
                    value='that'
                    checked={value.value === 'that'}
                    onChange={handleChange}
                />
            </Form.Field>
        </Form>
    )
};

当我单击单选按钮时,UI 中没有任何react。

在调试器中运行我看到它handleChange被调用并且似乎在做正确的事情,但它看起来像是undefined传递给checked函数。

我在这里做错了什么?

1个回答

我在 Codesandbox 上尝试了 Semantic UI,发现event.target.value- 是未定义的,因为target- 是一个label元素,而不是input,所以你需要改变

const handleChange = event => setValue({value: event.target.value});

const handleChange = (event, {value}) => setValue({ value });

就像语义 UI 的文档说的

还有一个建议。如果您只需要存储一个单选按钮值,则无需将其存储在对象中,因此您可以将代码重写为:

export const RadioExampleRadioGroup = () => {
    const [value, setValue] = useState(null);
    const handleChange = (event, {value}) => setValue(value);

    return (
        <Form>
            <Form.Field>
                Selected value: <b>{value}</b>
            </Form.Field>
            <Form.Field>
                <Radio
                    label='Choose this'
                    name='radioGroup'
                    value='this'
                    checked={value === 'this'}
                    onChange={handleChange}
                />
            </Form.Field>
            <Form.Field>
                <Radio
                    label='Or that'
                    name='radioGroup'
                    value='that'
                    checked={value === 'that'}
                    onChange={handleChange}
                />
            </Form.Field>
        </Form>
    )
};