ReactJS:来自 State 的动态复选框

2024-01-10

我有一个动态元素的集合,所以我事先不知道该集合的内容是什么。我想动态渲染这些复选框,并默认将它们全部选中。您应该能够取消选中这些框,这会在渲染中触发另一个地图功能。 (所以基本上这是我的过滤器)

我在国家设置上苦苦挣扎。 我正在考虑以下内容,我想通过 API 调用在 ComponentWillMount 期间设置初始状态:

scenario 1 (arrays): 

this.state {
    checkboxes: [value1, value2, value3],
    checkedcheckboxes: [value1, value2]
}

然后我可以使用react.addons.update函数来更改复选框状态。缺点是,在渲染复选框期间,我必须在每个复选框上使用 indexOf 循环遍历 checkcheckboxes 数组,以查看是否应该检查它。

scenario 2 (object):

this.state {
    checkboxes: {
       value1: true,
       value2: true,
       value3: false
}

这样我就有了动态键,这使得工作变得更加困难(我猜),因为我必须在 setState 中使用计算字段。我还认为这可能会对我的表现产生负面影响。

这种模式有什么最佳实践吗?

谢谢你!


我可能会将您的状态设置为包含一个对象数组(代表您的复选框)和一个代表您的过滤器的字符串。每个复选框对象将包含两个属性:标签的文本和复选框的值。

对于您的初始状态,您希望该数组为空,然后在componentDidMount在生命周期中,您将执行 API 调用并将状态设置为包含您收到的信息。

constructor(props) {
    super(props);

    this.state = {
        checkboxes: [],
        filter: 'ALL'
    };

    //each checkbox would take the form of {label: 'some label', checked: true}
}

componentDidMount() {
    getData(response => { //some API call
        this.setState({
            checkboxes: response.body
        });
    });
}

为了让您的组件呈现这些复选框,它需要了解状态下的复选框对象与实际 DOM 元素的关系。您可以创建一个辅助函数来利用.map去做这个。您还可以利用.filter将过滤器应用于您所在州的每个对象,并删除与过滤器不匹配的对象。

function renderCheckboxes() {
    const {checkboxes, filter} = this.state;

    return checkboxes
        .filter(checkbox =>
            filter === 'ALL' ||
            filter === 'CHECKED' && checkbox.checked ||
            filter === 'UNCHECKED' && !checkbox.checked
        )
        .map((checkbox, index) =>
            <div>
                <label>
                    <input
                        type="checkbox"
                        checked={checkbox.checked}
                        onChange={toggleCheckbox.bind(this, index)}
                    />
                    {checkbox.label}
                </label>
            </div>
        );
}

请注意每个复选框如何将 onChange 属性映射到某个函数?您需要将其提供给使用以下方式呈现的每个复选框checked属性,因为您将创建一个受控组件 https://facebook.github.io/react/docs/forms.html#controlled-components,并且您的状态将控制是否检查每个单独的组件。你的toggleCheckbox函数可能看起来像这样:

function toggleCheckbox(index) {
    const {checkboxes} = this.state;

    checkboxes[index].checked = !checkboxes[index].checked;

    this.setState({
        checkboxes
    });
}

创建一个将过滤器设置为不同字符串的函数也可能很有用:

function updateFilter(filter) {
    this.setState({
        filter
    });
}

最后,您可以在您的应用程序中使用这些功能render函数来显示您的复选框以及更新过滤器状态的链接(我还添加了一些不间断空格来分隔每个过滤器链接):

render() {
    return (
        <div>
            {renderCheckboxes.call(this)}
            <div>
                <h4>Filters ({this.state.filter})</h4>
                <a href="#" onClick={updateFilter.bind(this, 'ALL')}>ALL</a>
                &nbsp;|&nbsp;
                <a href="#" onClick={updateFilter.bind(this, 'CHECKED')}>CHECKED</a>
                &nbsp;|&nbsp;
                <a href="#" onClick={updateFilter.bind(this, 'UNCHECKED')}>UNCHECKED</a>
            </div>
        </div>
    );
}

以下是此工作的示例 - 减去 API 调用:

https://jsbin.com/bageyudaqe/edit?js,输出 https://jsbin.com/bageyudaqe/edit?js,output

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactJS:来自 State 的动态复选框 的相关文章

随机推荐

  • Zend 2:如何从控制器抛出 404 错误

    我想从我的控制器抛出 404 页面未找到 错误 我怎样才能做到这一点 我使用 Zend Framework 2 而不是 1 class IndexController extends AbstractActionController pub
  • 部署 Django 应用程序,无需服务中断/无停机时间

    我们还没有持续集成设置 但要部署得非常频繁 每天一次左右 我们有一个非常标准的 Django 应用程序和一个单独的 Postgres 服务器 我们使用普通租用的虚拟机 没有 Amazon 或 Rackspace 我们如何才能最大限度地减少应
  • 如何解决在 Microsoft SQL 中使用 xp_cmdshell 时出现的“访问被拒绝”错误?

    这是我的整个日常 Declare AttFileType as char 5 HQCo as int FormName as Varchar 15 KeyID as VarChar 10 UniqueID as uniqueidentifi
  • forEach 不是函数错误

    当我尝试使用 foreach 迭代 JSON 对象时 出现此错误 有人可以帮忙吗 这是我的JS function dateTimeChecker ajax url get booked php method get dataType tex
  • Java找不到构造函数

    像大多数新程序员一样 我有一个我无法解决的小但重要的问题 我的程序不会拉动我的构造函数 我尝试了很多不同的方法 但似乎无法弄清楚 任何帮助将不胜感激 Error EmployeeTest java 13 cannot find symbol
  • Symfony5 使用 AJAX 表单多选(选择列表)数据自动更新

    我有一个位置表单 其中包含三个 选择 选择列表 国家 地区和部门 这些 选择 默认包含所有国家 地区和部门的列表 我想让我的用户首先选择一个国家或地区或部门 我想做的事 当用户选择一个国家时 区域中的数据会根据该国家 地区而变化 地区和部门
  • 类是原始类型。对泛型类型 Class 的引用应该参数化

    我有以下课程 来自简单的 Spring 教程 public class CarValidator implements Validator public boolean supports Class aClass return Car cl
  • 有没有办法在 Flask WTForms 中创建数据列表字段?

    有谁知道一种方法来创建datalist在 Flask 中使用 WTForms 字段 我知道如何创建一个SelectField但如果列表中没有 我需要允许用户输入自己的值 这就是我想做的http www w3schools com tags
  • 引用Java属性文件中的其他变量[重复]

    这个问题在这里已经有答案了 可能的重复 如何引用java util Properties中的另一个属性 https stackoverflow com questions 872272 how to reference another pr
  • 无法禁用日志消息

    我在摆脱 Spring 生成的调试消息时遇到了一些麻烦 类似于以下消息 有数千个这样的条目 19 58 08 380 main DEBUG o s b f s DefaultListableBeanFactory Creating shar
  • “为什么运行时异常是不可恢复的?”

    在Java文档中 我看到了定义 如果可以合理地预期客户端会从异常中恢复 则将其设为受检查的异常 如果客户端无法执行任何操作来从异常中恢复 请将其设为未经检查的异常 未经检查的异常 争议 https docs oracle com javas
  • 如何使用 ProcessBuilder 与 CLI 程序持续交互

    我经常使用通过 docker 容器访问的 CLI 程序 进入容器后 我就可以开始使用相关的 CLI 程序 我遇到的问题是我想继续与同一个命令行实例交互 基本上我正在尝试创建一个将在 CLI 程序 之上 运行的 GUI 程序 我只是不知道如何
  • 为 AWS 设置“Stackdriver Kubernetes 监控”

    Google Cloud Platform 在 Kubecon 2018 上宣布了 Stackdriver Kubernetes Monitoring 看起来棒极了 我是一名运行着几个 Kubernetes 集群的 AWS 用户 我立即羡慕
  • 使用HMS Toolkit添加HMS和GMS时找不到com.huawei.hms:hwid:5.3.0.301 &推送套件

    我正在尝试将 HMS 添加到我们的 GMS 第一个应用程序中 这是一个庞大的应用程序 因此我们决定尝试 HMS Toolkit 转换软件 该工具包添加了必要的依赖项和模块 并在需要时进行了适当的替换 但是当我尝试构建我们的应用程序时 我收到
  • 异常:类型错误:无法设置未定义的属性“消息”

    在升级旧的 Angular 2 项目的许多依赖项后 我在运行时收到以下错误 EXCEPTION TypeError Cannot set property message of undefined ErrorHandler handleEr
  • gSoap EWS“错误 500:内部服务器错误”

    我在使用 ews gSoap 时遇到一些问题 我有下一个代码 ExchangeServiceBindingProxy proxy new ExchangeServiceBindingProxy endpoint c str soap pSo
  • 如何使用 Spark 数据框评估 Spark Dstream 对象

    我正在编写一个 Spark 应用程序 我需要根据历史数据评估流数据 这些数据位于 SQL Server 数据库中 现在的想法是 spark 将从数据库中获取历史数据并将其保存在内存中 并根据它评估流数据 现在我得到的流数据为 import
  • 如何在R中动态插入带有模式的列?

    这是一个跟进问题 https stackoverflow com questions 73938635 rename a column based on the original columns name r 73938710 noredi
  • 有没有办法在浏览器中编译代码(C/C++)?

    这个问题可能听起来很疯狂 有没有基于浏览器的编译器 本地客户端 https developer chrome com native client是一个沙箱 用于在浏览器中高效运行已编译的 C 和 C 代码 你可以探索这个
  • ReactJS:来自 State 的动态复选框

    我有一个动态元素的集合 所以我事先不知道该集合的内容是什么 我想动态渲染这些复选框 并默认将它们全部选中 您应该能够取消选中这些框 这会在渲染中触发另一个地图功能 所以基本上这是我的过滤器 我在国家设置上苦苦挣扎 我正在考虑以下内容 我想通