react-类组件1

类组件:

import { Component } from "react";

class App extends Component {
  constructor() {
    super();
    this.state = {
      message: "xxxxx",
    };
  }
  render() {
    return (
      <div>
        <div>{this.state.message}</div>
      </div>
    );
  }
}

export default App;
import React from "react";
import ReactDOM from "react-dom/client";

import App from "./App";
//react18
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

this指向问题

cli(){ console.log(this)}默认情况下this是undefined。
在正常的dom操作中监听点击事件,监听的函数的this是节点对象。
而react并不是直接渲染成真实dom,它本质上是一个React的Element对象。在监听的时候,函数并没有绑定this,所以默认情况想就是一个undefined。

直接调用相当于默认调用
在这里插入图片描述
可以通过bind给它绑定this,render里面有this,指向组件实例。

add(){
  console.log(this)
}
render(){
  console.log(this)
  return (
   <div>
    <button onClick={this.add.bind(this)}>+</button>
   </div>
  )
}

直接在html中绑定不太方便,可以在constructor中提前绑定

 constructor(){
   this.add = this.add.bind(this)
 }
 add(){
   console.log(this)
 }
 render(){
   return (
    <div>
     <button onClick={this.add}>+</button>
    </div>
  )
 }

还有更简单的方法使用箭头函数

//setState简短说明
//setState继承自Component,
//调用setState后,会将state中的xxx的值修改掉,然后自动重新执行render函数
 add(){
   console.log(this)
   this.setState({

   })
 }
 render(){
   return (
    <div>
     <button onClick={()=>this.add()}>+</button>
    </div>
  )
 }

jsx

jsx是js的拓展语法,也在许多地方成为JavaScript XML。
jsx顶层只能有一个根元素,jsx中的标签可以是单标签,也可以是双标签。

jsx嵌套变量作为子元素

当变量为Number,String,Array时,可以直接显示。
当变量为null,undefined,boolean时,内容为空,如果需要显示的话可以将它们转换为字符创,例如使用toString
当变量为Object时,不能作为子元素

class App extends Component {
  constructor() {
    super();
    this.state = {
      message: "xxxxx",
      age: 18,
      address: ["!1", "222"],
      isSelected: true,
      test: " ",
      //  test: null,   test:undefined
    };
  }
  render() {
    const { message, age, address, isSelected, test } = this.state;
    return (
      <div>
        <div>{message}</div>
        <div>{age}</div>
        <div>{address[0]}</div>
        <div>{isSelected.toString()}</div>
        <div>{test}</div>
      </div>
    );
  }
}

在这里插入图片描述

当变量为Object时
在这里插入图片描述

使用表达式

class App extends Component {
  constructor() {
    super();
    this.state = {
      message: "xxxxx",
      age: 18,
      address: ["!1", "222"],
      isSelected: true,
      test: null,
      obj: {
        name: "111",
        age: 19,
      },
    };
  }
  address() {
    return <span>test</span>;
  }
  render() {
    const { message, age, address, isSelected, test, obj } = this.state;
    if (isSelected) {
      this.setState({
        obj: {
          age: 100,
        },
      });
    }

    return (
      <div>
        <div>{message}</div>
        <div>{age}</div>
        <div>{address[0]}</div>
        <div>{isSelected.toString()}</div>
        <div>{test}</div>
        <div>{Object.keys(obj)[0]}</div>
        {/* 使用表达式*/}
        <div>{19 - 1}</div>
        <div>{isSelected ? "true" : "false"}</div>
        <div>
          {[1, 2, 3].map((item) => {
            return <li>{item}</li>;
          })}
        </div>
        <div>{obj.age}</div>
        <>{this.address()}</>
      </div>
    );
  }
}

在这里插入图片描述

绑定 title,src,href,class,style

 this.state = {
      title: "xxx",
      href: "https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-image",
      url: "https://img-blog.csdnimg.cn/direct/38f2d0b33be2462796e2a123165e3fd8.png",
    };
    render() {
    const { title, href, url } = this.state;

    return (
      <div>
        <h1 title={title}>111</h1>
        <a href={href}>a</a>
        <img src={url} />
      </div>
    );
  }

绑定className,style

 render() {
 
    const className = `aaa  ${isSelected ? "active" : ""}`;
    const classList = ["aa", "bb"];
    classList.push("vvv");
    return (
      <div>
        <div className={className}>11</div>
        <div style={{ fontSize: "20px", color: "red" }}>www</div>
        <div className={classList.join(" ")}></div>
      </div>
    );
  }

事件的绑定

事件名使用小驼峰命名,通过{}传入一个事件处理函数,这个函数会在事件发生时被执行

<button onClick={this.add.bind(this)}>+</button>

传递event和其他参数

class App extends Component {
  constructor() {
    super();
    this.state = {
    };
  }
  add(event, age, num) {
    console.log(event);
    console.log(age, num);
  }

  render() {
    return (
      <div>
        <button onClick={this.add.bind(this, "xx", 19)}>1</button>
        <button onClick={(event) => this.add(event, "zzz", 11)}>2</button>
      </div>
    );
  }
}

使用bind绑定的 event是最后一个
在这里插入图片描述

条件渲染

条件渲染的方式:

  1. 条件判断
  2. 三元运算符
  3. 与运算符&&

使用if条件判断

 render() {
    let ele;
    const { isShow } = this.state;
    if (isShow) {
      ele = <h1>show</h1>;
    } else {
      ele = <h1>hidden</h1>;
    }
    return (
      <div>
        <span>{ele}</span>
        <button onClick={(event) => this.add(event, "zzz", 11)}>2</button>
      </div>
    );
  }

在这里插入图片描述
三元运算符和与运算符

     <div>
        <span>{isShow ? ele : "test"}</span>
        <span>{isHidden + "" && "---11"}</span>
      </div>
/*  在 JavaScript 中,对 undefined 变量使用 && 运算符可能会导致将整个表达式的结果视为假值。
   这是因为在逻辑运算中,&& 运算符是一个短路逻辑运算符,如果左侧表达式的值为一个假值(例如 false、null、undefined、0、空字符串等),
那么整个表达式会立即返回左侧表达式的值,而不再计算右侧表达式。

如果想要确保对 undefined 变量进行逻辑运算时的预期行为,可以先将变量转换为字符串或者使用其他方法来处理。
*/
//模拟v-show
<div style={{display: isShow ? "block" : "hidden"}}> </div>

在这里插入图片描述

列表展示

使用map渲染列表

class App extends Component {
  constructor() {
    super();
    this.state = {
      list: [
        {
          id: 1,
          name: "111",
        },
        {
          id: 2,
          name: "222",
        },
        {
          id: 3,
          name: "333",
        },
        {
          id: 4,
          name: "444",
        },
      ],
    };
  }

  render() {
    const { list } = this.state;

    return (
      <div>
        {list.map((item) => {
          return <div key={item.id}>{item.name}</div>;
        })}
      </div>
    );
  }
}

export default App;
// jsx--ReactElement-真实dom

在这里插入图片描述

类组件

类组件的名称以大写字符开头,继承自React.Component,必须实现render函数。constructor是可选的。

import { Component } from "react";

class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
   

    return (
      <div>
       
      </div>
    );
  }
}

export default App;

render函数的返回值

当render被调用时,它会检查this.props和this.state的变化并返回以下类型之一:
1.React元素,通过jsx创建的
2. 数组或fragments
3. Portals,将子节点渲染到不同的dom中
4. 字符串或数值类型,它们在dom中会被渲染成文本节点
5. 布尔类型或null 什么都不渲染

函数组件的返回值类型也跟类组件的一样

生命周期

在这里插入图片描述

class App extends Component {
  constructor() {
    super();
    this.state = {};
    //初始化state
  }
  componentDidMount() {
    //组件已经渲染到dom中
  }
  componentDidUpdate(proProps,preState,snapshot) {
    //dom发生更新  ,snapshot getSnapshotBeforeUpdate传递的值
  }
  componentDidMount() {
    // 组件卸载,
  }
  shouldComponentUpdate(){
    return true  //是否更新,返回false就不会更新
  }
  getSnapshotBeforeUpdate(){
    //在更新前进行一些操作,返回的数据可以在 componentDidUpdate中获取
  return {
    name:"aaa"
  }
  }
  change(){
   this.setState({
   })  //调用setState后会触发render,然后重新渲染,在执行componentDidUpdate
  }
  render() {
    return <div>222</div>;
  }
}

组件间的通信

父组件向子组件传参

// 父组件
      <div>
        <Son name={"sssxasa"} age={18}></Son>
      </div>
------------------------
//子组件
class Son extends Component {
  constructor(props) {  // constructor 这一步可以省略
    super(props);
  }
  render() {
    const { name, age } = this.props;
    return (
      <div>
        <div>
          {name}:{age}
        </div>
      </div>
    );
  }
}

propTypes 参数类型
import { Component } from "react";
import PropTypes from "prop-types";
class Son extends Component {
  render() {
    const { name, age } = this.props;
    return (
      <div>
        <div>
          {name}:{age}
        </div>
      </div>
    );
  }
}

Son.propTypes = {
  name: PropTypes.string,
  age: PropTypes.number,
};
//设置默认值
Son.defaultProps = {
  name: "default",
  age: 18,
};

子组件向父组件传值

父组件向子组件传递一个方法,这个方法接受参数,子组件使用时把参数传递过来。

父组件

  getSon(val) {
    console.log(val)
  }
  render() {
    return (
      <div>
        <Son getSon={(val) => this.getSon(val)}></Son>
      </div>
    );
  }

子组件

class Son extends Component {
  render() {
    const { name, age, getSon } = this.props;
    return (
      <div>
        <div>
          {name}:{age}
        </div>
        <button onClick={() => getSon("传递的值")}>传递值</button>
      </div>
    );
  }
}

react中的插槽

react中有两种方式实现插槽:
组件的children 和props传递react元素

组件的children

这些元素会放到组件实例上,有多个元素时children是一个数组,
在这里插入图片描述
只有一个元素时,children就是对应的元素

       const { children } = this.props;
       <div>
          <div>{children}</div>
       </div>


     //通过设置chilidren可以限制传入单个元素或多个元素
     Son.propTypes={
       children:PropTypes.array //:PropTypes.element
    }
props传递react元素

在这里插入图片描述

可以通过传递一个函数,由子组件决定渲染的内容
在这里插入图片描述

context

React.createContext 创建 需要共享的Context对象

import React from "react";

const myContext = React.createContext();

export default myContext;

Context.Provider,每个context对象都会返回一个Provider React组件,它允许组件订阅context的变化。
Provider可以接受一个value,传递给组件

 render() {
    return (
      <div>
        <myContext.Provider value={{ color: "red", name: "sss" }}>
          <Son></Son>
        </myContext.Provider>
      </div>
    );
  }

Class.context.Type 挂载在class的contextType 属性会被重新赋值为由React.createContext()创建的Context对象,通过this.context可以使用Context上的值。

import { Component } from "react";

import myContext from "./context";
class Son extends Component {
  render() {
    const { name } = this.context;
    return <div>{name}</div>;
  }
}
Son.contextType = myContext;
export default Son;

函数式组件使用context需要使用context.Consumer
  return (
      <div>
        <myContext.Provider value={{ color: "red", name: "sss" }}>
          <Son></Son>
          <Test></Test>
        </myContext.Provider>
      </div>
    );
----------------------------------------
import myContext from "./context";
export function Test() {
  return (
    <div>
      <myContext.Consumer>
        {(value) => {
          return <h1>{value.name}</h1>;
        }}
      </myContext.Consumer>
    </div>
  );
}
使用多个provider

createContext可以设置默认值

import React from "react";

const myContext = React.createContext();

export default myContext;
export const testContext = React.createContext({
  age: 18,
  address: "asdasf",
});
  return (
      <div>
        <testContext.Provider value={{ age: 18, address: "fwefes" }}>
          <myContext.Provider value={{ color: "red", name: "sss" }}>
            <Son></Son>
            <Test></Test>
          </myContext.Provider>
        </testContext.Provider>
      </div>
    );

有多个context时,可以使用Consumer使用对应的context

import { Component } from "react";
import myContext, { testContext } from "./context";

class Son extends Component {
  render() {
    const { name } = this.context;
    return (
      <div>
        {name}
        <testContext.Consumer>
          {(value) => {
            return <h1>{value.address}</h1>;
          }}
        </testContext.Consumer>
      </div>
    );
  }
}
Son.contextType = myContext;
export default Son;

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

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

相关文章

Animate软件基础:重命名图层或文件夹

默认情况下&#xff0c;Animate 会按照创建顺序向新图层分配名称&#xff1a;图层 1、图层 2&#xff0c;依此类推。为了更好地反映图层的内容&#xff0c;可以对图层进行重命名。 如果需要对图层或图层文件夹进行重命名&#xff0c;请执行下列操作之一&#xff1a; 双击时间轴…

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

图文讲解IDEA如何导入JDBC驱动包

前言 学习JDBC编程,势必要学会如何导入驱动包,这里笔者用图文的方式来介绍 视频版本在这里 50秒教你怎么导入驱动包然后进行JDBC编程的学习_哔哩哔哩_bilibili 忘记录音频了,大伙凑合着看 下载驱动包 https://mvnrepository.com/artifact/mysql/mysql-connector-java 去中…

推荐3款电脑必备专业软件,错过拍大腿

SolveigMM Video Splitter SolveigMM Video Splitter是一款功能强大的视频编辑工具&#xff0c;主要用于视频的无损剪切和合并。该软件支持多种常见的视频格式&#xff0c;如AVI、WMV、ASF、MP3、WMA等。此外&#xff0c;它还支持AVCHD、MPEG-2、WebM、FLV等格式&#xff0c;并…

2024春秋杯网络安全联赛夏季赛-PWN

文章目录 stdout测试setvbuf(stdout, 0LL, 2, 0LL)绕过或者输出直到缓冲区满使用system("/bin/sh")或者onegadget即使setvbuf(stdout, 0LL, 0, 0LL);也能立即有回显参考[https://starrysky1004.github.io/2024/07/05/2024-shu-qi-xue-xi-ji-lu/#toc-heading-4](https…

软件工程(下)

目录 需求工程 概述 需求获取 分层 获取方法 项目管理维度 需求开发---需求分析 UML&#xff08;统一建模语言&#xff09;&#xff1a;平台无关、语言无关 UML 41视图 需求的定义、验证、跟踪、变更 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 软件…

传知代码-多行人姿态检测系统

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本项目创新在于采用多级网络串联工作来进行目标的行为分析&#xff0c;并使用在视频监控领域&#xff0c;可部署在任何有需要的人员流动密集场所(如医院&#xff0c;机场&#xff0c;养老院等)或者用于空巢…

ubuntu18虚拟机克隆后不能上网和磁盘损坏问题

小学期直接给学弟学妹们自己配好的克隆的虚拟机&#xff0c;结果出现了这两种问题&#xff0c;参考了网上好多资料&#xff0c;太多了忘了存了&#xff0c;花了好久的时间才解决&#xff0c;这里记录一下。 磁盘损坏问题&#xff1a; 网络无法连同问题&#xff0c;ip addr发现…

硅谷甄选二(登录)

一、登录路由静态组件 src\views\login\index.vue <template><div class"login_container"><!-- Layout 布局 --><el-row><el-col :span"12" :xs"0"></el-col><el-col :span"12" :xs"2…

【总线】AXI第九课时:介绍AXI响应信号 (Response Signaling):RRESP和 BRESP

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

Web测试方法与技术

HTML概述&#xff08;Hyper Text Markup Language&#xff09; HTML基本结构 1、网页骨架 用HTML编写的网页中有一些结果是默认且必须存在的&#xff0c;这些结构就叫做网页骨架。 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…

结束休刊博客真·vlog | 顺便说一下500粉的事

啊&#xff0c;首先是信 ♥亲爱的读者们&#xff0c; 在这个充满数字韵律与代码奇迹的时空里&#xff0c;我满怀激动与感激的心情&#xff0c;提笔写下这封信&#xff0c;宣布一个令人振奋的消息——经过一段时间的休整与充电&#xff0c;我终于要结束这段宝贵的休刊时光&…

【堆 优先队列】1354. 多次求和构造目标数组

本文涉及知识点 堆 优先队列 LeetCode1354. 多次求和构造目标数组 给你一个整数数组 target 。一开始&#xff0c;你有一个数组 A &#xff0c;它的所有元素均为 1 &#xff0c;你可以执行以下操作&#xff1a; 令 x 为你数组里所有元素的和 选择满足 0 < i < target.…

JDBC编程的学习——MYsql版本

目录 前言 什么是JDBC ??? 前置准备 使用JDBC的五个关键步骤 1.建立与数据库的连接 2.创建具体的sql语句和Statement 3.执行SQL语句 4.处理结果集 5.释放资源 完整流程展示 前言 笔者在先前的博客就提过会写关于JDBC的内容 [Mysql] 的基础知识和sql 语句.教你速成…

Security认证要点速记

登录校验流程 springSecurity已经为我们默认实现了一个用不着的登录功能&#xff0c;我们需要自己实现个符合我们需求的登录功能&#xff0c;所以我们需要去了解默认登录功能的流程&#xff0c;对其中的部分进行替换 SpringSecurity底层就是过滤器链&#xff0c;包含实现了各种…

(自用)多进程与信号

程序和进程 程序≠进程 产生进程 创建进程——fork函数 函数原型 #include <unistd.h> pid_t fork(void); 函数功能: fork函数的功能是创建一个与当前进程几乎完全相同的子进程。这个“几乎完全相同”指的是子进程会复制父进程的代码段、数据段、BSS段、堆、栈等所…

dledger原理源码分析(四)-日志

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的日志&#xff0c;包括写入&#xff0c;复制…

esp32硬件电路设计

ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com)

看惯了黑黝黝的大屏风格再来看浅色系的大屏,很漂亮很个性

**看惯了黑黝黝的大屏风格&#xff0c;再来看浅色系的大屏&#xff0c;很漂亮很个性** 在科技产品的世界里&#xff0c;大屏设计一直以其沉浸感和视觉冲击力占据着一席之地。然而&#xff0c;当我们长时间沉浸在那些深邃、沉稳的黑黝黝大屏中时&#xff0c;是否曾想过换一种风…