前端React笔记(尚硅谷)

news2024/11/26 0:28:21

react

尚硅谷react教程

  • jsx语法规则

    1.定义虚拟dom时不加引号(不是字符串)

    2.标签中混入js表达式时要用{}

    https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled.png

    js表达式与js语句不同。

    js语句是if(),for(),switch()等等。

    const data = ['a','b','c'];
    const VDOM=(
    	<div>
    		<ul>
    			{
    				data.map((item)=>{
    					return <li>{item}</li>
    				})
    			}
    		</ul>
    	</div>
    )
    

    3.样式的类名要用className

    className='title'
    

    4.内联样式

    style={{color:'white'}}
    

    5.只有一个根标签

    6.标签必须闭合

    <button></button>
    <button/>
    

    7.标签首字母

    小写字母开头 将标签转为html;若无则报错

    大写字母开头 渲染相应组件,若组件无定义报错

  • constructor()构造器

    构造器不传props会出现未知错误

    是否传递取决于是否希望在构造器中使用this.props

    class MyComponent extends React.Component{
        constructor(props){
            super(props)//必传
            this.state={ihHot:true}
        }
    }
    

    constructor一般可以不写,写的时候用于以下俩种情况:

    1.初始化内部state (this.state)

    2.为时间处理函数绑定实例(this指向问题)

  • 函数式组件

    https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%201.png

    函数定义首字母大写,渲染页面时函数写成闭合标签

  • 类式组件

    1.类中的构造器不是必须写。需要对示例初始化(添加属性)的时候写

    2.如果A继承B类,且A类中写了构造器,则A类构造器中super必须调用

    3.类中所定义的方法都放在类的原型对象上,供实例使用

    4.类中可以直接写赋值语句

    class MyComponent extends React.Component{
        render(){
            return 
        }
    }
    
  • 类式组件实例三大核心属性

    • 1.state:改变组件状态

      1)基本使用

      class MyComponent extends React.Component{
          constructor(props){
              super(props)
              this.state={isHot:true}
          }
      }
      
      class MyComponent extends React.Component{
          state={}//初始化状态
      }
      

      2)状态使用setState()合并更改,不是替换

      每次setState都会重新调用render

      this.setState({isHot:!isHot})
      

      3)constructor和render中this都指向组件。

      组件自定义方法this指向undefined,通过以下俩种方法指向组件

      changeweather=()=> {//this指向父层
       }
      
      class MyComponent extends React.Component{
                  constructor(props){
                      super(props)
                      this.state={ihHot:true}
                      this.changeweather=this.demo.bind(this)
      //右侧的this.demo即下面的demo方法,bind生成新函数,实例对象变为括号里的this
                  }
                  render(){
                      const {isHot}=this.state
                      return <h2 onClick={this.changeweather}>今天天气{isHot?'炎热':'凉爽'}</h2>
                  }
                  demo() {
                      const isHot=this.state.isHot;
                      this.setState({isHot:!isHot})
                  }
              }
      
    • 2.props:给组件传入数据

      • 花括号代表里面是js代码,… 是展开运算符

        展开运算符一般用于展开数组,拼接数组

        const arr1=[1,2,3];
        const arr2=[4,5,6];
        const arr3=[...arr1,...arr2]
        

        只有这种时候可以使用…p展开运算符展开遍历对象

        class Person extends React.Component{
            render(){
                const {name,age,sex}=this.props
                return (
                    <ul>
                        <li>姓名{name}</li>
                        <li>sex{sex}</li>
                        <li>age{age}</li>    
                    </ul>
                )
            }
        }
        const p={name:"xw",age:17,sex:'nv'}
        ReactDOM.render(<Person {...p}/>,document.querySelector('.demo'))
        
      • Prop是只读的

        对props实例限制,大小写敏感

        Person.propTypes={
            name:PropTypes.string.isRequired,//name只能是string类型且实例时必须传入
        		sex:PropTypes.string,
            age:PropTypes.number,
            speak:PropTypes.func,
        }
        

        对props默认值

        Person.defaultProps={
            sex:'没有传性别',
            age:18
        }
        
      • Prop简写

        class Person extends React.Component{
        	 static propTypes={
              name:PropTypes.string.isRequired,
              sex:PropTypes.string,
              age:PropTypes.number,
              speak:PropTypes.func,
            }
            static defaultProps={
                sex:'没有传性别',
                age:18
        	   }
            render(){
                const {name,age,sex}=this.props
                return (
                    <ul>
                        <li>姓名{name}</li>
                        <li>sex{sex}</li>
                        <li>age{age}</li>    
                    </ul>
                )
            }
        }
        
      • 函数式组件使用props

        function Person(props) {
            const {name,age,sex}=props
            return (
                <ul>
                    <li>姓名:{name}</li>
                    <li>{sex}</li>
                    <li>{age}</li>
                </ul>
            )
        }
        Person.propTypes={//限制
        }
        Person.defaultProps={//默认参数
        }
        ReactDOM.render(<Person name="qq" age={18} sex="女" />,document.querySelector('.text'))
        
    • 3.refs:绑定俩个组件

      • 字符串形式的ref(不推荐使用)

        class Demo extends React.Component{
            showData=()=>{
                const {button1}=this.refs
                alert(button1.value)
            }
            render(){
                return(
                    <div>
                        <input ref="button1" type="text"/>
                        <button onClick={this.showData}>点我</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<Demo/>,document.querySelector(".text"));
        
      • ref回调函数

        ref回调函数如果以内联函数的方式定义,在节点更新过程中重新执行render,ref回调函数被执行俩次,第一次传入参数null(清空ref),第二次传入dom节点,定义成类的绑定函数可以避免更新时调用俩次的问题(不会清空ref)

        class Demo extends React.Component{
                    showData=()=>{
                        const {button1}=this
                        alert(button1.value)
                    }
                    render(){
                        return(
                            <div>
                                <input ref={(a)=>{this.button1=a}} type="text"/>
                                <button onClick={this.showData}>点我</button>
                            </div>
                        )
                    }
                }
                ReactDOM.render(<Demo/>,document.querySelector(".demo"));
        

        简写

        <input ref={c=>this.input1=c} type="text"/>
        

        定义成类的绑定函数

        <input ref={this.saveInput} type="text"/>
        
      • React.creatRef(推荐)

        可以返回一个容器,该容器可以存储被ref所标识的一个节点(不能是多个)

        class Demo extends React.Component{
                    myRef=React.createRef()//创建ref
                    showData=()=>{
                        console.log(this.myRef.current.value);
                    }
                    render(){
                        return(
                            <div>
                                <input ref={this.myRef} type="text"/>
                                <button onClick={this.showData}>点我</button>
                            </div>
                        )
                    }
                }
        
      • event.target

        避免过度使用ref:如果操作的dom和触发事件的dom为同一个则可以通过event.target

        showData=(event)=>{
        	alert(event.target.value)//拿到input的值
        }
        render(){
        	return(
        		<input onBlur={this.showData} type="text"/>//失去焦点触发showData
        	)
        }
        
  • 受控组件和非受控组件

    输入类dom现用现取即为非受控组件

    受控组件如下代码(随着输入已经存储入state,使用时再从state中取出)

    demo = (event)=>{
    	console.log(event.target.value)
    }
    <input onChange={this.demo} type="text"/>
    
  • 高阶函数

    高阶函数分为俩种:1.接收的参数是函数 2.返回值是函数

    常见高阶函数:Promise,setTimeout,arr.map()

    new Promise(()=>{})
    setTimeout(()=>{})
    

    函数的柯里化:通过函数调用返回函数,实现多次接收参数最后统一处理的函数编码形式

    • 柯里化 返回值函数实例

      onChange调用的是saveForm函数

      <input onChange={this.saveForm} type="text" name="username"/>
      

      实例:onChange调用return返回值

      saveForm=(dataType)=>{
          return (event)=>{
              this.setState({[dataType]:event.target.value})
          }
      }
      <input onChange={this.saveForm('username')} type="text" name="username"/>
      
    • 不用柯里化的实现方式

      saveFormData=(dataType,event)=>{
      	this.setState({[dataType]:event.target.value})
      }
      用户名<input onChange={(event)=>{this.saveFormData('username',event)} type="text" name="username"}>
      密码<input onChange={event => this.saveFormData('password',event) type="password" name="password"}>
      
  • 生命周期回调函数

    生命周期钩子函数,生命周期函数,生命周期钩子

    • 旧版

      初始化阶段
      	constructor()//构造器
      	componentWillMount()//组件将要挂载
      	render()
      	componentDidMount(){}//组件挂载完毕(一般做初始化:开启定时器,发起网络请求,订阅信息)
      更新阶段:由this.setState或父组件重新更新render触发
      	shouldComponentUpdate()//询问它是否允许更新组件(默认返回值是true)
      	render(){}//初始化渲染,状态更新以后
      卸载组件
      	componentWillUnmount(){}//组件将要卸载时(一般做收尾:清理定时器等)
      

      生命周期流程图:forceUpdate()不更改状态中的数据强制更新

      https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%202.png

    • 新版

      新版本(即将过时,避免使用)
      UNSAFE_componentWillReceiveProps()
      UNSAFE_componentWillMount()
      UNSAFE_componentWillUpdate()
      

      https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%203.png

      getDerivedStateFromProps(){}//可以返回null或状态对象
      getDerivedStateFromProps(props,state){return props}//返回state obj后无法修改该obj
      
      getSnapshotBeforeUpdate(preprops,prestate){return props,state}
      componentDidUpdate(snapshotValue){}//接收到快照返回值
      
  • key的一些问题

    虚拟DOM中key用于数据更新,React会将新虚拟DOM与旧虚拟DOM的diff比较

    • 用map中的index作为key可能引发的问题

      1、若对数据进行:逆序添加,逆序删除等破环顺序的操作

      会产生没有必要的真实DOM更新,效率低

      2、如果包含输入类DOM(类似于input)

      会产生错误DOM更新:界面有问题

  • Todolist的总结

    https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%204.png

  • 连续解构赋值+重命名

    https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%205.png

  • 解决多级路径刷新页面样式丢失的问题

    https://gitee.com/onlytonight/csdn-note-image/raw/master/react/react%205823ac4eb28f4f62bc522e5f6d9d3e7b/Untitled%206.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏

首页设计 仿抖音短视频&#xff1a;采用短视频流的形式展示内容&#xff0c;用户可浏览、点赞、评论和分享短视频。关注与我的&#xff1a;提供用户关注列表和个人中心入口&#xff0c;方便用户管理关注对象和查看个人信息。本地直播&#xff1a;集成直播功能&#xff0c;支持…

小程序如何通过把动态数据值传入到css文件中控制样式

场景&#xff1a;动态改变一个模块的高度 一、常用解决方法&#xff1a;行内样式绑值&#xff0c;或者动态class来传递 <viewclass"box":style"height: ${boxHeight}px">我是一个动态高度的box,我的高度是{{boxHeight}}px </view>二、高度传…

CSS导读 (元素显示模式 下)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 3.6 元素显示模式转换 3.7 (一个小技巧)单行文字垂直居中的代码 3.8 单行文字垂直居中的原理 3.9 小案例…

matlab conv2

MATLAB卷积conv、conv2、convn详解-CSDN博客

Java | Leetcode Java题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> letterCombinations(String digits) {List<String> combinations new ArrayList<String>();if (digits.length() 0) {return combinations;}Map<Character, String> phoneM…

3月产品更新来袭,快来看有没你期待的功能

亮点更新一览 增强制作报表易用性&#xff0c;提升用户体验&#xff0c;如仪表盘图层锁定保持原有层级、即席查询支持批量选择表字段。 增强报表展示和分析能力&#xff0c;满足更多项目需求&#xff0c;如仪表盘表格支持配置是否显示分析菜单按钮、Web电子表格新增多选输入…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…

【Linux】编写并运行Shell脚本程序操作实例

关于Shell脚本的介绍&#xff1a; Shell脚本是一种用于自动化任务和简化常见操作的脚本语言&#xff0c;通常用于Linux和Unix环境中。Shell脚本允许用户通过编写一系列命令和逻辑语句来执行一系列任务&#xff0c;从而提高了工作效率和自动化水平。 以下是关于Shell脚本的详细…

工业级POE交换机的测试标准

工业级POE交换机的测试标准通常包括以下方面&#xff1a; 1. IEEE 802.3标准&#xff1a;工业级POE交换机遵循IEEE 802.3标准&#xff0c;该标准规定了以太网设备的通信协议和物理层规范。 2. POE标准&#xff1a;工业级POE交换机支持POE&#xff08;Power over Ethernet&…

【软件测试之因果图法】

【软件测试之判断表法】(蓝桥课学习笔记) 1、因果图法的概念 因果图法是一种利用图解法分析输入的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种情况的组合。因果图&#xff08;Cause-Effect-Graphing&#xff09;提供了把规则转…

Rust语言

文章目录 Rust语言一&#xff0c;Rust语言是什么二&#xff0c;Rust语言能做什么&#xff1f;Rust语言的设计使其适用于许多不同的领域&#xff0c;包括但不限于以下几个方面&#xff1a;1. 传统命令行程序&#xff1a;2. Web 应用&#xff1a;3. 网络服务器&#xff1a;4. 嵌入…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引&#xff0c;这两种索引的区别是&#xff1a; 普通索引&#xff08;Non-Unique Index&#xff09;&#xff0c;也称为非唯一索引&#xff0c;它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

2024年第十四届MathorCup数学应用挑战赛A题解题思路

2024年第十四届MathorCup数学应用挑战赛A题解题思路点击链接加入【2024年第十四届MathorCup数学建模】&#xff1a; http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kNol416eFZyg4AFPHCZsYfGkLnEnZ8H36&authKeyo9lIFgRfnk2U%2FfYYg1AlFJd5I456CSA2M6nlvJX2qcUockIKuMHj%2Bh…

【Java】SpringBoot快速整合mongoDB

目录 1.什么是mongoDB&#xff1f; 2.Docker安装mongoDB 3.SpringBoot整合mongoDB步骤 4.验证 1.什么是mongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#x…

HWOD:最长回文子串

一、知识点 1、两层遍历&#xff0c;第一层i从0到n&#xff0c;第二层j从n到i 2、每一次的遍历&#xff0c;i确定子串的左边界l&#xff0c;j确定子串的右边界r 3、判断l和r界定的子串是否回文&#xff1a;while(l<r){如果下标为l和r的元素不相等&#xff0c;就break;l;r…

JAVAEE之Spring AOP

1. AOP概述 AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC) 1.1 什么是AOP&#xff1f; • Aspect Oriented Programming&#xff08;⾯向切⾯编程&#xff09; 什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程. 什么是⾯向特定⽅法编…

python之堆的实现

堆本质是一个完全二叉树&#xff0c;分为大根堆和小根堆&#xff0c;大根堆每个结点的值都大于它的孩子的值&#xff0c;小根堆相反&#xff0c;每个结点的值都小于它的孩子的值 heapq是python的标准库&#xff0c;用于维护堆&#xff0c;非常方便 heapq库常用的几个函数 he…

(3)(3.1) 英特尔Realsense深度摄像头(三)

文章目录 前言 10 系统概述 11 手动设置配套计算机 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在配套计算机上运行的 Python 脚本&#xff08;非 ROS&am…

每天学点儿Python(5) -- 序列索引和切片

Python中&#xff0c;序列是指一块可存放多个值的连续内存空间&#xff0c;这些值按一定顺序排列&#xff0c;可通过每个值所在位置的编号&#xff08;称为索引&#xff09;访问它们。它类似于C/C中的数组或字符串&#xff0c;但又比数组或字符串强大很多 序列类型包括字符串、…

(洛谷P34060):海底高铁—->差分数组,贪心思想

海底高铁 题目描述 该铁路经过 N N N 个城市&#xff0c;每个城市都有一个站。不过&#xff0c;由于各个城市之间不能协调好&#xff0c;于是乘车每经过两个相邻的城市之间&#xff08;方向不限&#xff09;&#xff0c;必须单独购买这一小段的车票。第 i i i 段铁路连接了…