React基础写法

news/2024/7/15 17:45:23 标签: react.js, javascript, 前端

一、react与vue对比

Vue是双向数据绑定,react是单项数据绑定,没有指令,配合JSX

javascript"><input value={ v } onInput={e=> setState{{v:'abc'}} }>

15以前 React.createClass{{options对象}}

16版本

javascript">class App implaments React.Compont{ 
    val='abc'  
    construct(){ 
        / *  数据初始化  */ 
    } , render(){ 
        /* JSX */ 
    }
 },
this.setState 修改数据

16.8以后 支持hooks

任何组件都是一个闭包,纯函数(始终不依赖上下文环境遍历,只看入参和出参)

Vue:API的支持,属性改变,自动通知并且依赖订阅发布模式,达成改一个,通知多个更新react:Fiber研发3年,调度并管理组件数据机制,利用requestldleCallback,将任务拆分为逐个小任务,平滑的在每一帧渲染空闲执行

周边生态:

  • React,react-router,axios,redux,antd-design
  • 小程序:taro(多端开发)
  • 整合:DVA (简化API)
  • 脚手架:create-react-app

二、脚手架使用

javascript">npm i -g create-react-app / yarn add create-react-app

create-react-app -V

# 创建项目
create-react-app 项目名字

# 运行
cd 项目名字
npm start

React.StrictMode:日志会多一遍,可以选择注释掉

javascript">import logo from './logo.svg';
import './App.css';
// 16 class 写法
import React from 'react';
class App extends React.Component {
  state = {
    name: 'hhhh',
    num: 0
  }
  constructor(props) { //  数据初始化
    super(props); //接受参数
    this.state.num = 1;
    this.test = this.test.bind(this)
  }
  change(changeNum) {
    console.log(changeNum)
    let  Num = changeNum+1;
    this.setState({ //数据变更
      num: Num
    })
  }
  test(){
    console.log(this)
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload. {this.state.name}
          </p>
          <button onClick={() => this.change(this.state.num)}>{this.state.num}</button>
          <button onClick={ this.test }>测试this</button>
        </header>
      </div>
    )
  }
}
// function App() {
//   return (
//     <div className="App">
//       <header className="App-header">
//         <img src={logo} className="App-logo" alt="logo" />
//         <p>
//           Edit <code>src/App.js</code> and save to reload.
//         </p>
//         <a
//           className="App-link"
//           href="https://reactjs.org"
//           target="_blank"
//           rel="noopener noreferrer"
//         >
//           Learn React
//         </a>
//       </header>
//     </div>
//   );
// }

export default App;

三、相关基础

组件

        React中的组件是Web应用程序中可重用的代码块。它们可以分解为小的、独立的部分,从而使构建大型应用程序变得更加容易。

        React中有两种类型的组件:类组件函数组件。类组件是使用ES6类语法定义的,它们有自己的状态和生命周期方法。函数组件是使用函数定义的,它们没有自己的状态或生命周期方法。在React16.8版本之后,函数组件引入了Hooks,使得它们也能够管理自己的状态和生命周期方法。

javascript">// 父组件
import React from "react";
import Children from "./chilren";
export default class Parent extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            isShow: true,
        };
    }
    destroy() {
        this.setState({
            isShow: false
        })
    }
    render() {
        return (
            <div>
                { this.state.isShow?<Children msg={'我来了'}/>:null }
                <button onClick={e => this.destroy()}>销毁子组件</button>
            </div>

        )
    }
}

// 子组件
import React from "react";
export default class Children extends React.Component{
    constructor(props){
        super(props);
    }
    
    render(){
        let { msg } = this.props;
        return (
            <div>
                { this.props.msg }
            </div>
        )
    }
}

JSX

JSX是一种JavaScript语法扩展,它允许在JavaScript中编写类似HTML的代码。在React中,JSX用于描述组件的UI。JSX代码被转换成JavaScript对象,这些对象描述了组件的UI结构和内容。

javascript">function App()
{
    return
        (
            <div>
                <h1>Hello,World!</h1>
            </div>
        )
}

props

Props是React中组件之间通信的一种机制。它是一个组件的属性,可以通过父组件传递给子组件。组件可以使用props来接收外部数据,并将它们渲染为UI。

四、生命周期

React组件生命周期方法分为三类:挂载、更新和卸载

挂载

挂载是将组件添加到DOM的过程中,依次执行以下方法:

  • constructor
  • getDerivedStateFromProps
  • render
  • componentDidMount

更新

组件已经在DOM中,但其props或state发生变化时的过程,依次执行以下方法:

  • getDerivedStateFromProps
  • shouldComponentUpdata
  • render
  • getSnapshotBeforeUpdate
  • componentDidUpdate

卸载

将组件从DOM中移除的过程组件会执行以下方法:

  • componentWillUnmount

举例:

javascript">import React from "react";

export default class Cycle extends React.Component {
    
    constructor(props){
        super(props);
        this.state = {
            num: 1,
        };
        console.log('constructor')
    }
    getDerivedStateFromProps
    componentDidMount() {
        // 类似于Vue中的mounted,需要优先保障元素渲染(设计思想不同)
        console.log('componentDidMount');
        // 发请求并修改数据
    }
    componentWillUnmount(){
        console.log('componentWillUnmount');
    }
    // 对比是否需要更新(优化)
    shouldComponentUpdate(){
        console.log('shouldComponentUpdata');
        if(this.state.num === 3) {
            console.log('更新')
            return true
        }
        else{
            console.log('更新')
            return false;
        }
    }
    change() {
        this.setState({
            num: 3
        })
        
    }
    render() {
        console.log('渲染了。。')
        return (
            <div>
                <h1>生命周期{ this.state.num }</h1>
                <button onClick = {e=> this.change() }>更改数据</button>
            </div>
        )
    }
}

输出:


http://www.niftyadmin.cn/n/199755.html

相关文章

k8s 集群部署traefik

k8s 集群部署traefik k8s 集群部署traefik环境准备下载traefikhelm方式安装traefik(master边缘节点)执行安装查看安装结果安装traefik dashboarddashboard安装和查看第一个Traefik ingress例子Q&Ak8s 集群部署traefik 环境准备 k8s version:v1.24.2 Helm version.BuildI…

【从零开始学习 UVM】10.7、UVM TLM —— TLM Fifo [uvm_tlm_fifo]

文章目录 UVM TLM FIFO Example1. 创建一个发送器类,其端口类型为 `uvm_blocking_put_port`2. 创建接收器类,使用 get 方法进行接收。3. 通过高层次的 TLM FIFO 连接这两个组件假设发送方的数据速率比接收方获取数据包的速率快得多。需要在两者之间插入一个FIFO元素来存储数据…

单片机_CT107D训练平台电路原理图\蓝桥杯训练板\ 存储/IO 扩展模块\ 8255 扩展芯片\EEPROM 芯片 AT24C02\

存储/IO 扩展 8255 扩展芯片原理图&#xff1a; 8255芯片是Intel公司生产的可编程并行I/O接口芯片&#xff0c;有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片&#xff08;40引脚&#xff09;。 其各口功能可由软件选择&#xff0c;使用灵活&#xff0c;通用性…

电脑小白必备的五款软件,让你的电脑变身神器

你想让你的电脑更好用吗&#xff1f;这里有五款电脑软件可以帮你&#xff0c;它们可以让你的电脑更高效、美观、安全&#xff0c;快来看看吧&#xff01; 1.虚拟桌面——Dexpot Dexpot是一款虚拟桌面软件&#xff0c;可以让你在一个电脑上创建和使用多个独立的桌面&#xff0…

链接PIC18引导程序和应用程序

使用MPLAB XC8 C编译器和MPLAB X IDE的PIC18引导加载程序和可下载应用程序的典型内存布局 介绍 使用编程到设备中的引导程序&#xff0c;您可以轻松下载和执行应用程序&#xff0c;而无需将产品带回车间。但是&#xff0c;由于引导加载程序和应用程序都驻留在一个设备中&#…

JavaScript 解决冒泡事件导致的性能问题

在 JavaScript 中&#xff0c;当有大量的子元素都需要绑定同一个事件时&#xff0c;冒泡事件可能会导致性能问题。这时可以使用以下方法来解决性能问题。 使用事件委托&#xff1a;通过在父元素上绑定事件监听器&#xff0c;然后在事件处理函数中判断事件的触发元素是否是需要…

Android OKHttp源码解析

Https是Http协议加上下一层的SSL/TSL协议组成的&#xff0c;TSL是SSL的后继版本&#xff0c;差别很小&#xff0c;可以理解为一个东西。进行Https连接时&#xff0c;会先进行TSL的握手&#xff0c;完成证书认证操作&#xff0c;产生对称加密的公钥、加密套件等参数。之后就可以…

设计模式-结构型模式-组合模式

我们很容易将“组合模式”和“组合关系”搞混。组合模式最初只是用于解决树形结构的场景&#xff0c;更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象封装起来完成一个统一功能. 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合…