发布于 2026-01-06 5 阅读
0

React:一个简单的入门

React:一个简单的入门

最近我在学习 React,虽然远称不上专家,但我很享受边学边教的过程。这不仅能帮助别人学习,还能巩固我所学的知识,并获得一些反馈,让我了解自己可能不理解的地方。由于我还在学习,我会把我以前的一个项目迁移到 React 上,我选择的项目是Material Design 的 Switch 组件

目标是只需编写一个 HTML 标签,就能恢复一个简洁、美观且易于使用的切换开关。我将使用 JSFiddle 来演示各个步骤。

<MaterialSwitch>Toggle switch</MaterialSwitch>
Enter fullscreen mode Exit fullscreen mode

例子

设置

首先,我们先快速创建一个组件hello world!。我知道在这个简单的阶段,我们可以使用React 函数式组件而不是完整的类,但稍后我们需要使用类来访问状态,所以我们先从一个类开始。

这个类需要继承React.Component,只需要这个render()函数。函数在这里。


ReactDOM.render(<MaterialSwitch />, document.querySelector("body"))
Enter fullscreen mode Exit fullscreen mode

<MaterialSwitch />你会注意到我在最后添加了这一行,在这个演示中,我们可以假装它与html 中的代码相同。

创造

现在让我们来实际考虑一下我们要创建的组件,它是一个复选框,所以我们需要;

  • 标签文本child- 复选框旁边显示的文本
  • readOnly property- 该复选框是否只读?
  • 已禁用property- 该复选框是否已禁用?
  • defaultChecked property- 加载时处于选中状态
  • 已检查state- 内部已检查状态

我想这就是我们需要的全部内容了,我这里有三个不同的标签child组件和属性都是从上层组件传递过来的,组件本身无法控制它们,它们只是存在而已。但是,状态可以在组件内部进行更改,这正是 React 的魅力所在。propertystate

添加状态和属性

因为我们需要使用状态,所以需要使用构造函数。使用构造函数时,必须确保propssuper函数传递参数,才能保证一切正常运行。

constructor(props) {
  /**
   * This is the super function it ensures
   * the constructor function still carries
   * out it's original purpose.
  */
  super(props);

  /*
   * Here I am setting up the default states
   * I am setting "checked" to be equal to 
   * the property "defaultChecked"
  */
  this.state = {
    checked: props.defaultChecked
  }
}
Enter fullscreen mode Exit fullscreen mode

我们还需要从现有项目中复制 HTML 代码,但要做一些 React 方面的修改。

render() {
  // This is how get our props, we could have
  // done this.props.readonly for each place
  // we wanted to use the props but I think 
  // this is easier to understand
  const {children, readonly, disabled, defaultChecked } = this.props;
  return (
    <label className="md_switch">
      <input 
        readonly={readonly}
        disabled={disabled}
        defaultChecked={defaultChecked}
        type="checkbox" 
      />
      <span className="md_switch__toggle"></span>
      {children}
    </label>
  )
}
Enter fullscreen mode Exit fullscreen mode

在JSXHTML中,任何你想使用变量的地方,只需将变量名放在花括号内,像这样{variable}

值得一提的是,在任何你想class向元素添加 `<a>` 的地方,你都必须使用 `<a>`className而不是标准的 `<a>`,class这是因为 ` class<a>` 是 JavaScript 中的保留字。

添加功能

我们的函数只需要在复选框的选中状态改变时更新状态即可。编写这个函数并不难,但要让它正常工作,我们还需要做一些其他工作。

/**
 * Update checked on change
 *
 * @param {Event} event - from the changed element
*/
changeHandler(event) {
  this.setState({checked: event.target.checked})
}
Enter fullscreen mode Exit fullscreen mode

很简单,将 checked 状态设置为事件的 checked 参数的目标。现在让我们把它连接到HTML/ JSX

render() {
  const {children, readonly, disabled, defaultChecked } = this.props;
  return (
    <label class="md_switch">
      <input 
        readonly={readonly}
        disabled={disabled}
        defaultChecked={defaultChecked}
        onChange={this.changeHandler}
        type="checkbox" 
      />
      <span class="md_switch__toggle"></span>
      {children}
    </label>
  )
}
Enter fullscreen mode Exit fullscreen mode

要向事件添加函数,只需添加 onEvent 标签,我们希望在更改时触发,所以我们将使用onChange(注意驼峰式命名)。

但这仍然行不通,因为在this.changeHandler上下文中this已经更改为event。为了确保上下文this仍然绑定到我们的 React 组件,我们需要在构造函数中添加以下代码行。

this.changeHandler = this.changeHandler.bind(this);
Enter fullscreen mode Exit fullscreen mode

活动

最后一段JS代码需要允许组件用户使用事件,所以我们会使用`.`将事件传递回去props。由于我们已经在使用onChange事件,我们需要修改函数,以便将事件进一步传递。

/**
 * Update checked on change
 *
 * @param {string} text
*/
changeHandler(event) {
  const { onChange } = this.props;
  this.setState({checked: event.target.checked});

  If(typeof onChange === "function") onChange(event);
}
Enter fullscreen mode Exit fullscreen mode

onChange从 props 中获取了信息,现在我们可以将事件传递上去。我添加这个typeof函数是为了以防万一用户添加了一些奇怪的内容,或者甚至什么都没添加。

HTML/部分JSX就简单多了,我们只需要像这样传递我们的 prop 即可

render() {
  const {children, readonly, disabled, defaultChecked, onInput } = this.props;
  return (
    <label class="md_switch">
      <input 
        readonly={readonly}
        disabled={disabled}
        defaultChecked={defaultChecked}
        onChange={this.changeHandler}
        onInput={onInput}
        type="checkbox" 
      />
      <span class="md_switch__toggle"></span>
      {children}
    </label>
  )
}
Enter fullscreen mode Exit fullscreen mode

造型

样式设置非常简单,只需添加我们的 CSS 代码即可。我不会详细介绍 CSS 代码,因为它与我复刻的原始帖子中的代码完全相同。代码如下。

总结

好了,我们已经完成了第一个 React 组件。它包含一个简单的标签,可以用来切换 Material Design 的样式。

让我们来看看HTML最终结果。

<div>
  <MaterialSwitch>Toggle Switch</MaterialSwitch>
  <br />
  <MaterialSwitch defaultChecked>Pre-activated</MaterialSwitch>
  <br />
  <MaterialSwitch disabled>Disabled</MaterialSwitch>
  <br />
  <MaterialSwitch defaultChecked disabled>
    Activated and disabled
  </MaterialSwitch>
  <br />
  <MaterialSwitch>
    Really really really long label
    content to hopefully span several lines
    to show that the checkbox will stay central.
  </MaterialSwitch>
</div>
Enter fullscreen mode Exit fullscreen mode

好了,就到这里,我们大功告成了,感谢阅读。如果您有任何问题、建议或者只是想聊聊天,欢迎在下方留言。再次感谢!

🦄🧠💕🦄🦄💕❤🧠💕❤

文章来源:https://dev.to/link2twenty/react-a-simple-start-3doj