我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React组件的使用详细讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React组件的使用详细讲解

1.组件的创建方式

函数式组件

特别注意这里的写法,如果要在 JSX 里写 js 表达式(只能是表达式,不能是流程 控制语句),就需要加 {},包括注释也是一样,并且可以多层嵌套

// 函数式组件
// 写组件模板的时候必须遵循jsx语法
function App() {
  return (
    <div className="App">
      hello reactjs
    </div>
  );
}

class组件

ES6 的加入让 JavaScript 直接支持使用 class 来定义一个类,react 的第二种创建组件 的方式就是使用的类的继承,ES6 class 是目前官方推荐的使用方式,它使用了 ES6 标准 语法来构建

// class组件
// 注意:组件名必须首字母大写(为了和普通标识符区分开),必须继承自 React.Component 组件
// class的好处就是可以在render并列的位置
// class组件中,使用的this是当前组件实例
// App这个组件必须继承自React.Component
class App extends React.Component {
  // App这个组件要想渲染什么由内部的render方法决定,必须要有render方法,这个render方法负责渲染组件的模板就是有什么标签
  // js中如果return后面没有语句就会自动加分号
  // 当想要使用插件时得改变 组件文件名的后缀改为jsx
  // 定义组件状态state,组件数据
  // 在constructor函数中对组件状态进行初始化
  constructor(props) {
    super(props)
    this.state = {//初始化组件状态
      count: 100,
      arr: ['nodejs', 'react', 'vue.js']
    }
  }
  // state = 100
  // state = {
  //   count: 100,
  //   arr: ['nodejs', 'react', 'vue.js']
  // }
  render() {//render中必须return返回 组件模板
    return (
      <div className="App">
        <h1>{this.state.count}</h1>
        <h1>{this.state.arr}</h1>
      </div>
    );
  }
}

2.组件命名规范

组件名称必须以大写字母开头。

<Welcome name="james">

小驼峰命名来定义属性

<Welcome className="blue" tabIndex="1" >

3.组件传值props

函数组件通过参数 props 接收外部组件传入的数据, 在组件内根据 props 处理 UI

传递值:

<Header id="1001" url="http://xxx.com"></Header>

接收值(函数式组件)

函数式组件用参数 props 接收值

function Header ( props ){
 return (
 <div className="header">
 {}
 <h1>{props.id},{props.url}</h1>
 </div>
 )
}

类组件中处理props

类组件通过this.props接收外部组件传入的数据,在组件内根据this.props处理UI

接收值(class组件)

class 组件内部用 this.props 接收值

class Header extends React.Component{
render(){
 return (
 <div className="header">
 {}
 <h1>{this.props.id},{this.props.url}</h1>
</div>
 )
 }
}

子组件:

import React, { Component } from 'react';
class Child extends Component {
    handleClick() {
        // this.props.title = 'state'; //props是只读的.
    }
    render() {
        return (
            <div className="child">
                {this.props.title}{this.props.count}
                <button onClick={() => { this.handleClick() }}>更改</button>
            </div>
        );
    }
}
export default Child;

父组件中

<Child title="今天学习props" count={100} />

注意:

<></> 原名是<Fragment>可以省略,充当的是一个包裹元素(包裹其他标签), 最终在页面中不会渲染.

4.组件样式sass

在react组件中,使用sass编写组件样式,需要依赖sass插件。

使用步骤:

下载插件

npm i sass -D

创建.scss文件,编写sass代码

在组件中引入scss文件

import './App.scss';

5.组件的生命周期函数

主文件

import './App.css';
import Child from './Child';
//react中存在两种形式的组件: 函数式组件, 类组件
//使用 rcc 快速创建 类组件  ( 主要使用这个 )
//使用 rsf 快速创建 函数式组件
import React, { Component } from 'react';
class App extends Component {
  // 挂载期(挂载期的方法会自动执行,而且只执行一次)
  constructor(props) {//这个函数会在组件挂载前就执行,组件并没有显示在页面上
    super(props);
    console.log('constructor');
    this.state = {}//初始化组件状态
  }
  componentWillMount() {//挂载前
    console.log('componentWillMount 将要挂载');
  }
  componentDidMount() {//挂载完成,组件就会显示在页面上
    console.log('componentDidMount 挂载完成');
    // 在这里发送网络请求,创建定时器,事件监听,理由是:这个方法只执行一次,而且会自动执行
    // 这里的this指的是组件实例this.timerid就是将定时器保存在当前组件实例身上,就可以在各个组件生命周期共享
    // 还可以直接保存在组件状态中,只不过保存在组件状态中定时器是可以改变的,如果不变化就可以保存在组件实例身上
    this.timerid = setInterval(() => {
      console.log('定时器在执行');
    }, 1000)
  }
  // 更新期(更新期的方法可能会反复调用执行)
  // 性能优化时写的地方
  shouldComponentUpdate(nextProps, nextState) {//控制组件是否更新,目的是提示组件性能(性能优化)
    // 组件性能优化:把有效的更新进行更新,无效的更新就不让它进行更新
    // 组件状态是否有变化,如果有变化就更新,没有变化就不更新
    // 当setState中的数据和state中的数据相等没有必要更新
    // if (this.state == nextState) {
    // 满足条件就不更新,传进来的state是两个对象,当每次更新的时候对象所指的地址都是不一样的,所以不能直接比较,要将对象转换为字符串进行比较
    if (JSON.stringify(this.state) == JSON.stringify(nextState)) {
      return false;
    } else {
      return true;//返回false 表示放弃更新,返回true 表示继续更新
    }
  }
  componentWillReceiveProps(nextProps) {//Props更新,才会执行(可以用这个函数来监听Props的变化)
    // nextProps 是最新的数据的对象
    // 用这个函数监听父组件传来的数据是否有变化
    console.log('componentWillReceiveProps 将要更新');
  }
  componentWillUpdate() {
    console.log('componentWillUpdate 将要更新');
  }
  componentDidUpdate() {
    console.log('componentDidUpdate 更新完成');
  }
  // 卸载期
  componentWillUnmount() {
    console.log('componentWillUnmount 将要卸载');
    // 在这里释放所占用的资源(网路请求,定时器,事件监听)
    clearInterval(this.timerid);
  }
  // render方法在组件初次渲染时会执行一次,在之后的组件每次更新时都会执行一次
  render() { //渲染组件模板到视图
    return (
      <div>
        <h1 className="class" id="big" onClick={() => { this.handleClick() }}>hello reactjs</h1>
        {}
        <Child title={this.state.count} />
      </div>
    );
  }
  handleClick() {//组件状态
    this.setState({ count1 });
  }
}
export default App;

子文件

import React, { Component } from 'react';
class Child extends Component {
    // 挂载期(挂载期的方法会自动执行,而且只执行一次)
    constructor(props) {//这个函数会在组件挂载前就执行,组件并没有显示在页面上
        super(props);
        console.log('constructor');
        this.state = {}//初始化组件状态
    }
    componentWillReceiveProps(nextProps) {//Props更新,才会执行(可以用这个函数来监听Props的变化)
        // nextProps 是最新的数据的对象
        // 用这个函数监听父组件传来的数据是否有变化
        // 传过来的值是新的就会执行,传过来的值不是新的就不会执行
        // 这里传过来的数据是一个对象,要将对象转换为字符串进行比较,因为对象每次更新地址都会变化,只是值不变
        console.log('Child componentWillReceiveProps 将要更新');
    }
    componentWillUpdate() {
        console.log('Child componentWillUpdate 将要更新');
    }
    componentDidUpdate() {
        console.log('Child componentDidUpdate 更新完成');
    }
    render() {
        return (
            <div>

            </div>
        );
    }
}
export default Child;

6.受控组件—表单处理

特别说明:HTML中表单元素是可输入的,也就是有自己的可变状态,但是默认表单元素的值不受所在组件state的控制,也就是表单元素所在组件无法实时获取最新的表单元素值

非受控组件

表单元素值不受所在组件状态的控制,我们将这样的表单元素称为:非受控组件

受控组件

受控组件:值受到React组件状态控制的表单元素

一般是通过defaultValue属性,onChange事件配合将非受控组件变为受控组件

  • 文本框、富文本框、下拉框操作value属性
  • 复选框操作checked属性
import './App.css';
//react中存在两种形式的组件: 函数式组件, 类组件
//使用 rcc 快速创建 类组件  ( 主要使用这个 )
//使用 rsf 快速创建 函数式组件
import React, { Component } from 'react';
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      phone: '',
      isRead: false//是否勾选协议
    }
  }
  handleChange(e) {
    this.setState({
      phone: e.target.value
    }, () => {
      console.log(this.state);
    })
  }
  handleChecked(e) {
    this.setState({
      isRead: e.target.checked
    }, () => {
      console.log(this.state);
    })
  }
  render() { //渲染组件模板到视图
    return (
      <div>
        {}
        {}
        {}
        <input type="text" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='请输入手机号' />
        <input type="checkbox" value={this.state.isRead} onChange={(e) => { this.handleChecked(e) }} />
      </div>
    );
  }
}
export default App;

多表单元素操作

  • 给表单元素添加name属性,名称与state相同
  • 根据表单元素类型获取对应值
  • 在change事件处理程序中通过[name]来修改对应的state
import './App.css';
//react中存在两种形式的组件: 函数式组件, 类组件
//使用 rcc 快速创建 类组件  ( 主要使用这个 )
//使用 rsf 快速创建 函数式组件
import React, { Component } from 'react';
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      phone: '',
      pass: '',
      isRead: false//是否勾选协议
    }
  }
  handleChange(e) {
    // 获取目标控件input元素对应的别名
    // e.target.name
    this.setState({
      // 因为别名是个变量,所以用方括号括起来
      // 如果是单选。复选框,通过e.target.checked取值
      // 如果是其它元素,通过e.target.value取值
      [e.target.name]: ((e.target.type == 'checkbox' || e.target.type == 'radio') ? e.target.checked : e.target.value)
    }, () => {
      console.log(this.state);
    })
  }
  login() {
    // 发送登录请求
    // 删除里面没有用的或者取出有用的传过去
    // 这样直接删除会影响之前的解决方法是深拷贝
    // delete this.state.isRead;
    // 深拷贝state
    var newState = JSON.parse(JSON.stringify(this.state));
    delete newState.isRead;
    console.log(newState);
    // user_login(this.state).then((res)=>{

    // })
  }
  render() { //渲染组件模板到视图
    return (
      <div>
        {}
        {}
        {}
        <input type="text" name="phone" value={this.state.phone} onChange={(e) => { this.handleChange(e) }} placeholder='请输入手机号' /><br />
        <input type="password" name="pass" value={this.state.pass} onChange={(e) => { this.handleChange(e) }} placeholder='请输入密码' />
        <input type="checkbox" name="isRead" value={this.state.isRead} onChange={(e) => { this.handleChange(e) }} />
      </div>
    );
  }
}
export default App;

到此这篇关于React组件的使用详细讲解的文章就介绍到这了,更多相关React组件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React组件的使用详细讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React组件的使用详细讲解

React组件分为函数组件与class组件;函数组件是无状态组件,class称为类组件;函数组件只有props,没有自己的私有数据和生命周期函数;class组件有自己私有数据(this.state)和生命周期函数
2022-11-16

React组件useReducer的讲解与使用

在React函数式组件中,我们可以通过useState()来创建state,这种state创建方式会给我们返回两个东西state和setState()。
2023-05-16

React超详细讲述Fiber的使用

在fiber出现之前,react的架构体系只有协调器reconciler和渲染器render。当前有新的update时,react会递归所有的vdom节点,如果dom节点过多,会导致其他事件影响滞后,造成卡顿。即之前的react版本无法中断工作过程,一旦递归开始无法停留下来
2023-02-08

Jetpacknavigation组件超详细讲解

首先Navigation是一个架构组件,因为切换Activity是一个Binder通信的过程,所以Activity是属于比较重的组件。而Fragment的切换其实只是View的切换,比较轻量级。因此单Activity加Fragment切换成为了比较常见的架构方式
2022-11-13

JetpackCompose图片组件使用实例详细讲解

在Compose中,图片组件主要有两种,分别是显示图标的Icon组件和显示图片的Image组件,当我们显示一系列的小图标的时候,我们可以使用Icon组件,当显示图片时,我们就用专用的Image组件
2023-05-16

JetpackCompose按钮组件使用实例详细讲解

这篇文章主要介绍了JetpackCompose按钮组件使用实例,按钮组件Button是用户和系统交互的重要组件之一,它按照MaterialDesign风格实现,我们先看下Button的参数列表,通过参数列表了解下Button的整体功能
2023-05-16

React高阶组件使用详细介绍

高阶组件就是接受一个组件作为参数并返回一个新组件(功能增强的组件)的函数。这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意,本文给大家分享React高阶组件使用小结,一起看看吧
2023-01-29

react component function组件使用详解

这篇文章主要为大家介绍了react component function组件的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

AndroidViewModel与Lifecycles和LiveData组件用法详细讲解

JetPack是一个开发组件工具集,他的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程。JetPack中的组件有一个特点,它们大部分不依赖于任何Android系统版本,这意味者这些组件通常是定义在AndroidX库当中的,并且拥有非常好的向下兼容性
2023-01-28

Vue动态组件与异步组件超详细讲解

这篇文章主要介绍了Vue动态组件与异步组件,动态组件是根据数据的变化,可以随时切换不同的组件,比如咱们现在要展示一个文本框和输入框,我们想要根据我们data中定义的值去决定是显示文本框还是输入框
2023-03-19

C++BoostTokenizer使用详细讲解

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-11-16

Vue组件与生命周期详细讲解

Vue的生命周期就是vue实例从创建到销毁的全过程,也就是newVue()开始就是vue生命周期的开始。Vue实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载等⼀系列过程,称这是Vue的⽣命周期
2022-11-13

hooks写React组件的5个注意细节详解

这篇文章主要为大家介绍了hooks写React组件的5个需要注意的细节详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-13

编程热搜

目录