模块化和抽象反应组件功能

2024-04-23

我下面有一个工作组件,允许所有复选框和复选框。它工作完美。然而,我讨厌这样的想法:每次我想使用此功能时,我都必须携带所有这些代码。我正在寻找一种在反应中使这个模块化的方法?这是

它不会将“输入检查所有”功能的整个功能模块化在一处。我必须在每次使用时移动 getInitialState 变量和changeHandlers。

我认为,如果“全部输入复选框”功能是 HTML 中原生的,我们将如何使用它?我们只需要向元素提供属性,它们就会互相引用,所有处理程序都会在幕后发生,使用起来很简单。我此示例的目标是实现 HTML 级别的简单性。我上面显示的代码没有实现这一点,因为它与函数处理程序和状态初始值设定项绑定在一起。 React 是否提供了一种抽象的方法?

下面是我想要的该组件的 API。

这是工作示例。 https://jsbin.com/ziwara/edit?js,output

主要问题是:

  • 组件功能与父组件无关,这意味着父组件不需要存储处理程序和状态的信息。
  • 目前,代码手动跟踪每个复选框的状态,这意味着无法在不声明的情况下动态查找 DOM 中的复选框数量。
  • 整体模块化和易用性。

这是代码:

var InputCheckbox = React.createClass({
  getDefaultProps: function () {
    return {
      checked: false
    }
  },
  render: function () {
    return (
    <input
           checked={this.props.checked}
           type='checkbox'
           {...this.props}/>
    )
  }
})

var Test = React.createClass({
  getInitialState: function () {
    return {
      checked: [false, false, false]
    }
  },
  selectAll: function (event) {
    // Set all checked states to true
    this.setState({
      checked: this.state.checked.map(function () {
        return event.target.checked
      })
    })
  },
  handleChange: function (index, event) {
    var checked = this.state.checked
    checked[index] = event.target.checked
    this.setState({
      checked: checked
    })
  },
  render: function () {
    var isAllChecked = this.state.checked.filter(function (c) {
        return c
      }).length === this.state.checked.length

    return (
    <div>
      Select All:
      <InputCheckbox onChange={this.selectAll} checked={isAllChecked}/>
      <br/>
      <InputCheckbox checked={this.state.checked[0]} onChange={this.handleChange.bind(this, 0)}/>
      <br/>
      <InputCheckbox checked={this.state.checked[1]} onChange={this.handleChange.bind(this, 1)}/>
      <br/>
      <InputCheckbox checked={this.state.checked[2]} onChange={this.handleChange.bind(this, 2)}/>
      <br/>
    </div>
    )
  }
})

React.render(<Test/>, document.body)

理想情况下我可以这样使用它:

var Checkbox = require('./Checkbox')

var Test = React.createClass({
  render: function () {
    return (
      <div>
        <Checkbox id="alpha"/>
        <Checkbox htmlFor="alpha"/>
        <Checkbox htmlFor="alpha"/>
        <Checkbox htmlFor="alpha"/>
      </div>
    )
  }
})

我认为以下示例是正确的总体方向,总体思路是为相关框引入一个包装器组件,然后遍历该组件中的子组件将它们连接在一起。

var CheckAll = React.createClass({
render() {
  return <input type="checkbox" {...this.props} />
}
});
var Checkbox = React.createClass({
render() {
  return <input type="checkbox" {...this.props} />
}
});
var CheckboxGroup = React.createClass({
setAll(to) {
  var result = {};
  Object.keys(this.props.boxes).forEach(k => result[k] = to)
  this.props.onChange(result);
},
setOne(name, to) {
  var result = {};
  Object.keys(this.props.boxes).forEach(k => result[k] = this.props.boxes[k])
  result[name] = to;
  this.props.onChange(result);
},
enrichChild(child) {
  var boxes = this.props.boxes;
  var all = Object.keys(boxes).every(k => boxes[k]);
  if (child.type == CheckAll) {
    return React.cloneElement(child, { checked: all,
      onChange: () => this.setAll(!all)
    });
  } else if (child.type == Checkbox) {
    var name = child.props.name;
    return React.cloneElement(child, { checked: !!boxes[name],
      onChange: ({target}) => this.setOne(name, target.checked)
    });
  } else {
    return child;
  }
},
render() {
  return (
    <div>
      {React.Children.map(this.props.children, this.enrichChild)}
    </div>
  )
}
});


var Test = React.createClass({
  getInitialState: function () {
    return {
      boxes: {
        a: true,
        b: false,
        c: false,
      }
    }
  },
  render: function () {
    return (
    <div>
      <CheckboxGroup
        boxes={this.state.boxes}
        onChange={boxes => this.setState({boxes})}
      >
        <CheckAll />
        <Checkbox name="a" />
        <Checkbox name="b" />
        <Checkbox name="c" />
      </CheckboxGroup>
    </div>
    )
  }
})

React.render(<Test/>, document.body)

这是一个 jsbin -https://jsbin.com/zomuxolevo/1/edit?js,输出 https://jsbin.com/zomuxolevo/1/edit?js,output

为了让孩子们更加灵活,您需要使用类似这样的要点递归地行走他们https://gist.github.com/dandelany/1ff06f4fa1f8d6f89c5e https://gist.github.com/dandelany/1ff06f4fa1f8d6f89c5e

var RecursiveChildComponent = React.createClass({
  render() {
    return <div>
      {this.recursiveCloneChildren(this.props.children)}
    </div>
  },
  recursiveCloneChildren(children) {
    return React.Children.map(children, child => {
      if(!_.isObject(child)) return child;
      var childProps = {someNew: "propToAdd"};
      childProps.children = this.recursiveCloneChildren(child.props.children);
      return React.cloneElement(child, childProps);
    })
  }
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模块化和抽象反应组件功能 的相关文章

  • 打字稿地图迭代失败

    我正在使用下面的函数来比较两个地图 有趣的是 for 循环内的代码永远不会被执行 所以 console log key val 代码永远不会被执行 当然 我确保我正在比较的映射不为空并且大小相同 以强制执行 for 循环内的代码 我犯了一个
  • 将 CSS 导入 HTML 不起作用

    我正在尝试将 CSS 文件 import 导入 HTML 但它不起作用 我确实尝试过链接路径 但它也不起作用 但这种格式似乎工作为 http U5 L ttJS http 127 0 0 1 54149 assets pages U5 JS
  • 将 PhotoSwipe 配置为不使用整个窗口?

    我目前正在尝试使用构建移动图片库照片滑动 http photoswipe com 我已经能够让它工作了 但有一个小问题 当我 单击照片缩略图 实际照片总是占据整个 视口 当您在移动设备上查看图库时 这是可以的 但是 如果您的视口是计算机屏幕
  • 如何从数组中删除空数组值(“”)?

    我有一个二维数组 是用 jQuery 从 html 表生成的 但有些值是空的 所以 被展示 如何删除空值 table tr th 1A th th 1B th th 1C th tr tr td 2A td td 2B td td 2C t
  • IE 抛出 JavaScript TypeError 但在 chrome 上不抛出

    描述在我们的 Magento 购物车上 当用户单击添加到购物篮在任何 Internet Explorer 浏览器的 产品详细信息 页面上单击按钮 浏览器中都会弹出一个包含以下错误消息的窗口 异常 类型错误 无法获取未定义或空引用的属性 ta
  • 淡化背景但不淡化文本

    我已经对 div 应用了 CSS 淡入 淡出解决方案 在很大程度上我对此感到满意 但是我只想将其应用于背景 而不是文本 我需要文本始终完全不透明 参见示例 http jsfiddle net howiepaul gUAPV 33 http
  • Redux 中的排队操作

    我目前遇到的情况是我需要连续运行 Redux Actions 我看过各种中间件 比如 redux promise 看起来不错如果您知道触发根操作 由于缺乏更好的术语 时的连续操作是什么 本质上 我想维护一个可以随时添加的操作队列 每个对象在
  • 解码URIComponent抛出错误“URI格式错误”

    As unescape已被弃用 我已选择decodeURIComponent 但它没有按预期工作 decodeURIComponent无法解码以下 URI 组件 Coast 20Guard 20Academy 20to 20hold 20a
  • 如何让 ckeditor 停止删除空 div

    stackoverflow 上也有类似的问题 但这些问题的答案对我不起作用 所以请不要将其标记为重复 在我的 cms 中 我希望人们能够添加 SPA 单页应用程序 内容页面 此类应用程序通常只有一个具有某些属性的 div 并且使用 java
  • 使用rvest或httr登录网页上的非标准表单

    我正在尝试使用 rvest 来抓取需要在表单上输入电子邮件 密码登录的网页 rm list ls library rvest Trying to sign into a form using email password url lt ht
  • 如何在 jQuery 中获取会话中的值

    我是 jQuery 的初学者 我想在 HTML 页面中设置值 并且必须在另一个 HTML 页面中获取它们 这是我现在正在尝试的代码片段 要在会话中设置值 session set userName uname val 要从会话中获取值 ses
  • 如何按高度对 DIV 进行排序?

    我有三个divs 我想按高度从最大到最小对它们进行排序 div smallest div div largest div div middle div 任何想法 这很简单 使用 sort http www wrichards com blo
  • 需要帮助在 D3.js 条形图中将 x 轴刻度与条形对齐

    我有一个可用的线性条形图D3 js http d3js org 它也有基于时间的 x 轴 条形图绑定到计数属性 而轴绑定到日期属性 轴上的刻度未与条形对齐 知道如何将它们两者排列起来吗 这是 jsFiddle http jsfiddle n
  • Jsoup遍历DOM树时节点哈希码冲突

    我正在使用 java jsoup 构建 HTML DOM 树 其中Node hashCode 用来 但我发现在遍历DOM树时存在很多哈希码冲突 使用以下代码 doc traverse new NodeVisitor Override pub
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • 计算 DIV 元素的最大/最小高度

    问题 给定一个具有固定高度的 DIV 元素 其中包含未知数量的子元素 这些子元素的大小相对于其高度 计算 DIV 可以调整大小的最大 最小高度 而不违反其子元素的任何最大 最小值元素 Example求 DIV A 的最大 最小高度 Answ
  • 脚本内的角度范围

    我们可以使用脚本标记内范围中定义的角度变量 如下所示 HTML 代码 div div JS CODE function AngularCtrl scope scope user name John 我只是得到 scope 未定义 有人可以帮
  • 在多个 html 文件上运行 javascript

    我有一个包含 1000 个 html 文件的文件夹 我必须使用 xpath 从每个 html 中删除某些节点 所以我已经制作了javascript 我无法打开每个文件并通过 Firefox 控制台运行 javascript 我用的是linu
  • 当外部 div 动画时,Div 内的 Div 隐藏

    我有一个高度为 0 的父 div 和一个子 div 但在顶部使用 z index 我想要这个子 div 在单击时扩展父 div 的高度 效果确实很好 但是内部 div 消失在与父 div 平行的其他 div 后面 当动画完成时 它会再次显示
  • 如何获取firestore集合下的文档数量? [复制]

    这个问题在这里已经有答案了 我想获取 firestore 集合中的文档总数 我正在制作一个论坛应用程序 所以我想显示每个讨论中当前的评论量 有类似的东西db collection comments get lenght或类似的东西 随着si

随机推荐

  • 如何在 Grails/GORM 中将域类模型对象从一个派生类更改为另一个派生类

    给定以下 Grails GORM 域类并使用每个层次结构表继承 class Book static belongsTo parent Parent String title abstract class Parent static hasM
  • BitBucket:身份验证失败

    我点击了这个链接 https confluence atlassian com bitbucket add an ssh key to an account 302811853 html https confluence atlassian
  • 多次或单次 Try Catch [重复]

    这个问题在这里已经有答案了 我正在清理一些代码 但我不确定哪条路线更好 目前 我的大部分方法都有一个 try catch 块 它在最后处理一些单独的异常 但我认为有更多的 try catch 块对于维护来说会更好 然而 在分解代码时 我发现
  • 安装 Cordova CLI 和 Ionic

    最近我安装了node js以及ionic和cordova sudo npm install g cordova ionic 一切似乎都运行良好 但是当我跑步时 ionic info Cordova CLI 似乎丢失了 Your system
  • 不带单位的 CSS 属性的后备

    考虑 CSS 属性缺少单位 px em pt 的场景 div style width 170 border 1 dotted PaleGreen background color MistyRose The quick brown div
  • php microtime() 格式值

    PHP microtime 返回如下内容 0 56876200 1385731177 that s msec sec 我需要这种格式的值 1385731177056876200 this is sec msec without space
  • C# 的检查点库

    我正在寻找 C 检查点库 有任何想法吗 see http en wikipedia org wiki Application checkpointing http en wikipedia org wiki Application chec
  • 如何使用 Openxlsx 包修改 Excel 工作簿中的现有工作表?

    我正在使用 openxlsx 包来读取和写入 Excel 文件 我有一个固定文件 其中包含一个名为 数据 的工作表 其他工作表中的公式使用该工作表 我想更新此数据表而不触及其他数据表 我正在尝试以下代码 write xlsx x Rev 4
  • 如何在 Tornado 中记录 HTTP 响应?

    我希望能够在龙卷风中记录 HTTP 请求和响应 这似乎很容易通过请求来完成 def log function handler info Method handler request method Host handler request h
  • 适用于新应用程序引擎应用程序的 Python 3.7 本地开发服务器选项

    我有一个在标准 Python3 运行时上部署和运行的应用程序引擎应用程序 我还可以使用普通命令在本地运行它 例如flask run 但我无法像在 2 7 运行时中运行应用程序那样运行它dev appserver py 我正在使用最新的gcl
  • Django_tables2:根据请求动态隐藏列

    我有一个基于具有多个字段的模型的表 我也有两个TemplateColumns 一个用于编辑特定实体 另一个用于删除它 这是我的代码 class EntitetTable tables Table edit tables TemplateCo
  • io.cucumber 和 info.cukes 之间有什么区别

    我正在尝试使用 Cucumber 集成 BDD 但我真的很困惑有什么区别io 黄瓜 and 信息库克斯图书馆 以及使用哪一种以及何时使用 我尝试阅读并理解 github自述文件 md https github com cucumber cu
  • 如何清理提交树中未使用的侧分支?

    如何清理提交树中未使用的侧分支 不是真正的 git 分支 示例 树 假提交哈希 提交消息 可选 指针 0001 last commit master origin master HEAD 0002 old unused merge 0003
  • 使用 Jquery 验证插件 Ajax 远程验证 WordPress 用户名和电子邮件

    有谁知道如何使用 jquery 验证插件验证 WordPress 用户名和电子邮件 我正在尝试使用验证的远程方法检查用户名和电子邮件是否存在 我注意到 WordPress 有 username exists 和 email exists 等
  • Java关闭PDF错误

    我有这个java代码 try PDFTextStripper pdfs new PDFTextStripper String textOfPDF pdfs getText PDDocument load doc doc add new Fi
  • 禁用 UITextfield 的键盘

    我想知道如何禁用 UITextfield 的输入视图 环境textField inputView nil or textField setInputView nil 在 ShouldBeginEditing 中不执行任何操作 并使用user
  • [NSObject:任何对象]?' Xcode 6 Beta 6 中没有名为“下标”的成员

    我正在 Swift 中的 Xcode 6 Beta 6 中构建一个应用程序 但我不断收到此错误 NSObject AnyObject does not have a member named subscript 我不知道如何解决这个问题 我
  • 生成ip和限时下载链接

    有一个用于下载文件的直接链接 用户可以在付款后下载该链接 如下所示 http example com download webapp rar 但我需要生成ip和时间限制的下载链接 以防止其他人窃取该文件 我想在不使用任何数据库的情况下执行此
  • 在哪里将 google-services.json 文件放入 eclipse 项目中?

    我正在尝试实施新的GCM client在安卓上 在某一时刻 您必须启用Google Services对于该应用程序 启用后Cloud Messaging你必须下载该文件google services json并将其放入app or mobi
  • 模块化和抽象反应组件功能

    我下面有一个工作组件 允许所有复选框和复选框 它工作完美 然而 我讨厌这样的想法 每次我想使用此功能时 我都必须携带所有这些代码 我正在寻找一种在反应中使这个模块化的方法 这是 它不会将 输入检查所有 功能的整个功能模块化在一处 我必须在每