杭州电子商务研究院

将自定义 React.js 组件包装为 HTML 按钮

2020-10-22 08:00飞浪

介绍

React.js 允许开发人员通过围绕 HTML 输入元素创建组件来扩展其默认功能。这为输入元素提供了更多自定义功能、行为,甚至是可以自行维护的值。在本指南中,我们将介绍如何为 HTML 按钮创建自定义组件并扩展其功能,而不仅仅是为其onClick属性附加事件处理程序。

设置

假设您要创建一个执行以下操作的按钮:

  1. 如果不可点击则将颜色更改为红色
  2. 如果可点击则将颜色更改为绿色
  3. 如果按钮不可点击,则将按钮文本更改为“正在加载...”

如果手动完成,这会非常繁琐。您可能有几个 JavaScript 例程会修改其行为,或者几个 CSS 文件可能会根据 JavaScript 添加或删除的类来更改其外观。如果您针对单个按钮执行此操作,这一切都很好。但是,如果您扩展到由后端进程生成的按钮数组之类的东西,则维护起来会变得很混乱。

为了解决这个问题,创建一个代表该按钮的组件,您可以将其称为MyCustomButton:

      import React from 'react';

export default class MyCustomButton extends React.Component {
  constructor(props) {
    this.state = {
      text: "Click Me"
    }
  }

  render() {
    return (
      <button>
        {this.state.text}
      </button>
    );
  }
}
    

这里没什么特别的。首先创建一个组件,该组件在其状态下维护一个文本值并呈现实际的 HTML 按钮。文本的值将成为按钮的实际文本,由this.state.text调用。

将颜色改为红色或绿色

接下来,你需要通过将其背景颜色更改为红色(如果不可点击)来指示按钮是否可点击。这意味着按钮的禁用状态设置为true。在 React.js 中解决此类问题时,请始终记住让组件管理所有内容,并仅让值通过props触发该组件的属性,该 props 最初传递给构造函数。你可以假设props可以有一个名为disabled 的属性,该属性可以由调用此MyCustomButton组件的外部组件选择性地传递。但是,由于它是可选的,因此你需要为它设置一个默认值。为此,创建一个名为disabled 的临时变量,该变量从render()中访问this.props.disabled:

      var disabled = this.props.disabled || false;
    

||表示如果this.props.disabled为空,则其初始值为false 。将该值与HTML 按钮的实际disabled属性挂钩:

      <button disabled={disabled}>
  {this.state.text}
</button>
    

接下来,您可以通过将对象传递给按钮的style属性来设置按钮的样式。就像disabled一样,您可以临时声明另一个变量来将对象的backgroundColor属性更改为red:

      var style = { backgroundColor: 'red' };
    

但是,如果disabled为false,则backgroundColor应该是绿色:

      if(disabled == false) {
  style = { backgroundColor: 'green' }
}
    

将变量style挂接到渲染的HTML按钮的属性style上:

      <button disabled={disabled} style={style}>
  {this.state.text}
</button>
    

处理文本

要将按钮的文本更改为“正在加载...”,可以使用与上一节相同的技术。创建一个临时变量文本,并根据disabled的值将其设置为“正在加载...” :

      var text = this.state.text;

if(disabled) {
  text = "Loading...";
}
    

将原始渲染的this.state.text替换为jsx中的文本。渲染后的按钮现在应如下所示:

      <button disabled={disabled} style={style}>
  {text}
</button>
    

总体代码

您的整体代码现在应如下所示:

      import React from 'react';

export default class MyCustomButton extends React.Component {
  constructor(props) {
    this.state = {
      text: "Click Me"
    }
  }

  render() {
    var style = { backgroundColor: 'red' };

    if(disabled == false) {
      style = { backgroundColor: 'green' }
    }

    var text = this.state.text;

    if(disabled) {
      text = "Loading...";
    }

    return (
      <button disabled={disabled} style={style}>
        {text}
      </button>
    );
  }
}
    

结论

您无需使用普通的 HTML 按钮并通过外部代码维护各种行为,而是可以创建一个自定义 React.js 组件作为该元素的包装器,并添加附加功能。如果您想要共享由应用自身逻辑呈现的动态生成的 UI 组件集的常见行为,这将特别有用。使用 React.js 将值传递给props,您可以相应地控制自定义组件的行为,甚至可以为其设置默认值,以免给外部代码增加输入初始值的负担。

作为一个额外的步骤,如果外部组件无法传递名为buttonText的props属性的值,请尝试查看是否可以将“单击我”文本设为默认值(提示:在这种情况下, state是存储文本的好地方吗,还是只需使用props就可以了)?

曝光29629浏览1618