【React教程】(3) React之表单、组件、事件处理详细代码示例

在这里插入图片描述

事件处理

参考文档:https://reactjs.org/docs/handling-events.html

示例1

<button οnclick="activateLasers()">
  Activate Lasers
</button>
<button onClick={activateLasers}>
  Activate Lasers
</button>

示例2

<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>
function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

示例3(this 绑定问题)

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

箭头函数:

class LoggingButton extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  handleClick = () => {
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

更简单的方式:

class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}

示例4(传递参数)

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

Class 和 Style

class:

<div className="before" title="stuff" />

classNames:


style:

<div style={{color: 'red', fontWeight: 'bold'}} />

表单处理

参考文档:https://reactjs.org/docs/forms.html

组件

React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。

组件规则注意事项

  • 组件类的第一个首字母必须大写
  • 组件类必须有 render 方法
  • 组件类必须有且只有一个根节点
  • 组件属性可以在组件的 props 获取
    • 函数需要声明参数:props
    • 类直接通过 this.props

函数式组件(无状态)

  • 名字不能用小写
    • React 在解析的时候,是以标签的首字母来区分的
    • 如果首字母是小写则当作 HTML 来解析
    • 如果首字母是大小则当作组件来解析
    • 结论:组件首字母必须大写

类方式组件(有状态)

class ShoppingList extends React.Component {
  render() {
    return (
      <div className="shopping-list">
        <h1>Shopping List for {this.props.name}</h1>
        <ul>
          <li>Instagram</li>
          <li>WhatsApp</li>
          <li>Oculus</li>
        </ul>
      </div>
    );
  }
}

// Example usage: <ShoppingList name="Mark" />

本质:

return React.createElement('div', {className: 'shopping-list'},
  React.createElement('h1', /* ... h1 children ... */),
  React.createElement('ul', /* ... ul children ... */)
);

组件传值 Props

EcmaScript 5 构造函数:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

EcmaScript 6 Class:

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

this.props.children

参考文档:https://reactjs.org/docs/react-api.html#reactchildren

this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。

它表示组件的所有子节点。

this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。

React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 还是 object

组件状态 State

参考文档:https://reactjs.org/docs/state-and-lifecycle.html

组件生命周期

参考文档:https://reactjs.org/docs/state-and-lifecycle.html

完整生命周期 API:https://reactjs.org/docs/react-component.html#the-component-lifecycle

PropTypes 类型校验

参考文档:https://reactjs.org/docs/typechecking-with-proptypes.html

组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。

示例:

import PropTypes from 'prop-types';

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

Greeting.propTypes = {
  name: PropTypes.string
};

Default Prop Values

参考文档:https://reactjs.org/docs/typechecking-with-proptypes.html#default-prop-values

示例:

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};

// Renders "Hello, Stranger":
ReactDOM.render(
  <Greeting />,
  document.getElementById('example')
);

或者:

class Greeting extends React.Component {
  static defaultProps = {
    name: 'stranger'
  }

  render() {
    return (
      <div>Hello, {this.props.name}</div>
    )
  }
}

和服务端交互

组件的数据来源,通常是通过 Ajax 请求从服务器获取,可以使用 componentDidMount 方法设置 Ajax 请求,等到请求成功,再用 this.setState 方法重新渲染 UI 。

获取真实 DOM 节点

参考文档:https://reactjs.org/docs/refs-and-the-dom.html

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。

但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性。

示例:

class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.focusTextInput = this.focusTextInput.bind(this);
  }

  focusTextInput() {
    // Explicitly focus the text input using the raw DOM API
    this.textInput.focus();
  }

  render() {
    // Use the `ref` callback to store a reference to the text input DOM
    // element in an instance field (for example, this.textInput).
    return (
      <div>
        <input
          type="text"
          ref={(input) => { this.textInput = input; }} />
        <input
          type="button"
          value="Focus the text input"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}

TodoMVC

  • classnames

开始

下载模板:

git clong https://github.com/tastejs/todomvc-app-template.git --depth=1 todomvc-react

安装依赖:

cd todomvc-react
npm install

安装 react 开发环境依赖:

npm install --save babel-standalone react react-dom

React 其它

React DevTools

https://github.com/facebook/react-devtools

create-react-app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【劳德巴赫 Trace32 高阶系列 1 -- svf 文件介绍】

文章目录 SVF 文件概述SVF文件的格式以及头Trace32 如何识别和使用SVF文件如何使用SVF文件SVF 命令支持总结小结总结SVF 文件概述 SVF 文件是一种ASCII文本文件,用于描述JTAG(Joint Test Action Group)测试动作的串行向量。这些文件包含了对JTAG TAP(Test Access Port)的…

寒假思维训练计划day16 A. Did We Get Everything Covered?

今天更新一道1月27号晚上div2的C题作为素材&#xff0c;感觉用到了我的构造题总结模型&#xff0c;我总结了一系列的模型和例题。 摘要&#xff1a; Part1 定义"边界贪心法" Part2 题意 Part3 题解 Part4 代码 Part5 思维构造题模型和例题 Part1 边界贪心…

生产解决方案:实现上传图片至主机文件夹下

1 需求&#xff1a; 目前需要实现&#xff0c;上传图片时候&#xff0c;自动根据图片上传地址&#xff0c;创建对应文件夹&#xff0c;例如&#xff1a;上传文件地址为&#xff0c;/2024/1/29/楼层1/1713.jpg&#xff0c;则存储结构应如下图所示。

[杂项:AD画板]B站_01

一、PCBA 1、快捷方式 CTRL鼠标滚轮&#xff1a;缩放界面 鼠标右键&#xff1a;拖拽界面 SHIFT鼠标滚轮&#xff1a;左右移动界面 CAPSLK鼠标滚轮&#xff1a;上下移动界面 CTRL鼠标左键&#xff1a;高亮选中接线网络 【】&#xff1a;调节高亮亮度&#xff0c;需要处于…

Sqli靶场 11--->22Less

打靶场&#xff0c;打靶场&#xff0c;打靶场&#xff0c;打靶场......靶场你别打我 球球 11.不用密码&#xff08;狂喜) 这一关知不知道账号密码都无所谓 那么我们就尝试一下报错类型&#xff0c;单引号报错&#xff0c;好&#xff0c;字符型 构造poc I_don_t_know_t…

C++ 之LeetCode刷题记录(二十二)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该…

[PHP]严格类型

PHP: 类型声明 - Manual

数字身份保护:Web3如何改变个人隐私观念​

随着Web3时代的来临&#xff0c;数字身份保护成为人们关注的焦点之一。Web3技术的引入不仅为个人隐私带来了新的挑战&#xff0c;同时也为我们重新思考和改变个人隐私观念提供了契机。本文将深入探讨Web3如何改变个人隐私观念&#xff0c;以及在数字身份保护方面的创新举措。 1…

计算机网络-H3C设备型号简介

H3C(新华三)的设备主要有&#xff1a;交换机、路由器、防火墙、无线AC、无线AP等组成。基本所有H3C设备都采用同一版本&#xff0c;基本命令都差不多&#xff0c;有V5、V7系列。 一、交换机系列 交换机有傻瓜式二层交换机&#xff0c;三层交换机&#xff0c;高端框式交换机。 交…

MATLAB环境下基于信号处理的EEG信号的睡眠纺锤波和K-复合波检测

睡眠纺锤波是正常人浅 - 中度睡眠脑电图的一种表现&#xff0c;随着睡眠深浅的变化而改变。睡眠纺锤波可以作为检测中枢神经机能正常与否的一个指标&#xff0c;对评估大脑发育与脑功能有重要意义。睡眠纺锤波在丘脑的后外侧腹侧核形成&#xff0c;通过投射系统投射到大脑皮层&…

CH395Q之CH395Q简介(一)

本节主要介绍以下内容&#xff1a; 1、TCP/IP协议栈是什么&#xff08;了解&#xff09; 2、CH395Q是什么&#xff08;了解&#xff09; 3、CH395Q工作命令&#xff08;熟悉&#xff09; 4、CH395Q & W5500 一、TCP/IP协议栈是什么 是一系列网络协议的总和&#xff0…

uni-app 微信小程序CI机器人自动化部署方案

uniApp微信小程序CI机器人自动化部署 1. 微信公众平台上&#xff0c;在开发设置里面小程序代码&#xff0c;将上传代码的服务IP地址填充下&#xff0c;生成一个上传秘钥下载下来 2. 将下载的秘钥文件放在uni-cli 项目的根目录下 3. npm 微信官方的miniprogram-ci模块 const c…

蓝桥杯省赛无忧 课件50 记忆化搜索

01 斐波那契数列 02 混境之地5 03 地宫取宝

Android开发学习-中级控件

Drawable Android把所有能够显示的图形都抽象为Drawable类(可绘制的)。 这里的图形不止是图片&#xff0c;还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下&#xff0c;其中drawable目录一般保存描述性的XML文件&#xff0c;而图片文件一…

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…

问卷与量表的区别,以及量表的信效度分析应该如何测量

最近在各个平台总能收到这样一个问题 “问卷如何进行信效度分析&#xff1f;”每次小编提到信效度分析时都会特意强调&#xff0c;只有量表才需要进行信度与效度分析&#xff0c;普通问卷&#xff08;单选、多选、填空等&#xff09;并不需要。那么今天就再深入探讨一下问卷与量…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

数字图像处理(实践篇)三十四 OpenCV-Python绘制椭圆

目录 一 涉及的函数 二 实践 一 涉及的函数 cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness) 参数: ①<

【计网·湖科大·思科】实验五 IPV4地址-分类地址和构建超网

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…