javascript - 使用数组数据渲染时单选按钮无法正常工作

标签 javascript reactjs radio-button

我有一个 React 组件,它呈现一个带有输入字段和单选按钮的数组。输入字段工作正常,但是当单击单选按钮时,即使状态已更新,该值也不会反射(reflect)在 UI 中。

以下是React组件的实现

import React, { useState } from 'react';
import './style.css';

export default function App() {
  const [subTemplate, setSubTemplate] = useState([
    { name: 'main', outputFormat: 'html' },
    { name: 'something else', outputFormat: 'text' }
  ]);

  const handleInputChange = (value, row, key) => {
    const updatedSubTemplate = subTemplate.map(item => {
      if (item.name === row.name) {
        return {
          ...item,
          [key]: value
        };
      }
      return item;
    });
    console.log('updatedSubTemplate', updatedSubTemplate); // updatedSubTemplate consists of the modified value 
    setSubTemplate(updatedSubTemplate);
  };

  const renderSubTemplates = () => {
    return subTemplate.map((item, index) => {
      return (
        <div key={index}>
          <input
            type="text"
            value={item.name}
            onChange={e => {
              handleInputChange(e.target.value, item, 'name');
            }}
          />
          <div>
            <input
              type="radio"
              name="html"
              checked={item.outputFormat === 'html'}
              onChange={e => {
                handleInputChange(e.target.name, item, 'outputFormat');
              }}
            />
            HTML
          </div>
          <div>
            <input
              type="radio"
              name="text"
              checked={item.outputFormat === 'text'}
              onChange={e => {
                handleInputChange(e.target.name, item, 'outputFormat');
              }}
            />
            TEXT
          </div>
        </div>
      );
    });
  };
  return <div>{renderSubTemplates()}</div>;
}

以下是上述实现的 stackblitz 链接:https://stackblitz.com/edit/react-ugat24

注意:如果数组中只有 1 个元素,单选按钮将按预期工作。

最佳答案

这是因为您的 name 属性的值不同。

单选按钮用于从选项列表中选择一个选项。因此它们需要具有相同的名称才能对它们进行分组。

 <input
    type="radio"
    name={`group-${index}`}
    checked={item.outputFormat === 'html'}
    onChange={e => {
         handleInputChange('html', item, 'outputFormat');
    }}
  />

工作示例

https://stackblitz.com/edit/react-4xxpev

关于javascript - 使用数组数据渲染时单选按钮无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69024112/

相关文章:

javascript - 递减进度条

javascript - Bootstrap 4 移动/桌面页面布局隐藏在带有标题的移动设备上的两个侧边栏

javascript - 将 true/false 绑定(bind)到 Knockout JS 中的单选按钮

javascript - 如何从数组 1 中删除项目并将项目推送到数组 2

vb.net - 使用 ASP :RadioButton 触发 OnCheckedChanged 事件

python - 我的单选按钮在选择它们后保持选中状态并且无法取消选择它们 python tkinter

javascript - 如何在 node.js 中使用 node-soap 或 strong-soap 添加 soap header

javascript - 使用钩子(Hook)输入搜索过滤器数组

javascript - React 路由器全局 header

angular - 为什么我的自定义组件内的 radio 输入元素无法与响应式表单一起正常工作?