• React-4 组件知识


    目录

    一、状态 :state

    1、组件的状态

    2、组件中的数据

    3、在类中定义state(只能写这个名字)对象

    4、使用setState要注意:

    二、属性:props(只读)

    1、state是内部属性,props是为了更好地实现复用性,从外部接收数据

    2、某组件

    3、MyNav.js

    4、函数式组件对于属性的应用会更简单一些,直接通过形参可以获得

    三、属性及状态总结

    1、属性是父组件对子组件的数据传输与操作

    2、状态是组件自己内部的数据

    四、表单

    1、受控表单元素

    2、非受控表单元素

    五、通信

    1、父传子:属性值

    2、子传父:回调函数

    3、在父组件中对子组件进行ref标记,可以获取到子组件的引用

    4、中间人模式:由父组件充当中间人,利用子传父+父传子模式完成

    5、发布订阅模式

    6、context状态树传参(官方提供)

    7、Redux:这个后面会讲到

    六、插槽

    1、默认形式

    2、按顺序插入

    3、作用

    七、生命周期(钩子函数)

    1、初始化阶段

    2、运行中阶段

    3、销毁阶段

    八、新生命周期(推荐)

    1、老钩子问题

    2、static getDeriveStateFromProps(nextProps,nextState)


    一、状态 :state

    1、组件的状态

    (1)有状态组件:设置了state的组件称之为有状态组件。   eg:类组件

    (2)无状态组件:没有设置state的组件称之为无状态组件   eg:函数组件

    2、组件中的数据

    1. class  A  extends  Component{
    2.     state = {key:value}
    3. }
    1. class  A  extends  Component{
    2.    constructor(){
    3.       super();
    4.       this.state = {
    5.          key:value
    6.       }
    7.    }
    8. }

    3、在类中定义state(只能写这个名字)对象

    state = {key:value}

    注意:<1>不要直接修改state(状态)

    1. //错误写法
    2. this.state.comment = 'ok'

              <2>要使用 this.setState()来更新state 

    1. //正确写法
    2. //this.setState({key:value})
    3. this.setState({comment: 'ok'});

    4、使用setState要注意:

    (1)在同步逻辑中,异步更新状态与真实dom

    1. import React, { Component } from 'react'
    2. export default class App extends Component {
    3. state={
    4. count:1
    5. }
    6. render() {
    7. return (
    8. <div>
    9. {this.state.count}
    10. <button onClick={this.handleClick}>同步逻辑button>
    11. <button onClick={this.handleClick2}>异步逻辑button>
    12. div>
    13. )
    14. }
    15. handleClick=()=>{
    16. this.setState({
    17. count:this.state.count+1
    18. })
    19. console.log(this.state.count);
    20. this.setState({
    21. count:this.state.count+1
    22. })
    23. console.log(this.state.count);
    24. this.setState({
    25. count:this.state.count+1
    26. })
    27. console.log(this.state.count);
    28. }
    29. }

    (2)在异步逻辑中,同步更新状态与真实dom

    1. import React, { Component } from 'react'
    2. export default class App extends Component {
    3. state={
    4. count:1
    5. }
    6. render() {
    7. return (
    8. <div>
    9. {this.state.count}
    10. <button onClick={this.handleClick}>同步逻辑button>
    11. <button onClick={this.handleClick2}>异步逻辑button>
    12. div>
    13. )
    14. }
    15. handleClick2=()=>{
    16. setTimeout(()=>{
    17. this.setState({
    18. count:this.state.count+1
    19. })
    20. console.log(this.state.count);
    21. this.setState({
    22. count:this.state.count+1
    23. })
    24. console.log(this.state.count);
    25. this.setState({
    26. count:this.state.count+1
    27. })
    28. console.log(this.state.count);
    29. },0)
    30. }
    31. }

    (3)接受第二个参数,是个回调函数,在这里状态与dom更新完毕

    1. handleClick = ()=>{
    2. this.setState({
    3. count:this.state.count+1
    4. },()=>{
    5. console.log(this.state.count)
    6. })
    7. this.setState({
    8. count:this.state.count+1
    9. },()=>{
    10. console.log(this.state.count)
    11. })
    12. this.setState({
    13. count:this.state.count+1
    14. },()=>{
    15. console.log(this.state.count)
    16. // 状态和真实dom已经更新完毕
    17. })
    18. }

    二、属性:props(只读)

    1、state是内部属性,props是为了更好地实现复用性,从外部接收数据

    1. //父组件
    2. <MyNav title={this.title} />
    3. //MyNav.js组件
    4. render(){
    5. return (
    6. <div>
    7. <p>{this.props.title}<p/>
    8. div>
    9. )
    10. }

    2、某组件

    1. {/*属性*/}
    2. <MyNav title={this.title} leftBtn={isShowLeft}/>

    3、MyNav.js

    1. render(){
    2.  let {title,leftBtn}=this.props;
    3.  return (
    4.  <div>
    5.     {leftBtn && <button>leftbutton>}
    6.    <p>{title}p>
    7.    <button>rightbutton>
    8.    
    9.   div>
    10.  )
    11. }

    (1)属性验证

    1. import myprop from 'prop-types'
    2. static propTypes={
    3.    title:myprop.string,
    4.    letBtn:myprop.bool
    5. }

    (2)默认属性

    1. //默认属性
    2. static defaultProps={
    3. title:'首页'
    4. }

    4、函数式组件对于属性的应用会更简单一些,直接通过形参可以获得

    三、属性及状态总结

    1、属性是父组件对子组件的数据传输与操作

    2、状态是组件自己内部的数据

    四、表单

    1、受控表单元素

    (1)由React控制

    (2)value绑定state中的值

    (3)实现表单元素的change事件

    (4)优化:可以使用name属性,统一完成change事件

    (5)注意:选择框与其他表单元素获取值的方式不一样

    1. class App extends React.Component {
    2. state = {
    3. txt: '',
    4. content: '',
    5. city: 'bj',
    6. isChecked: false
    7. }
    8. handleChange = e => {
    9. this.setState({
    10. txt: e.target.value
    11. })
    12. }
    13. // 处理富文本框的变化
    14. handleContent = e => {
    15. this.setState({
    16. content: e.target.value
    17. })
    18. }
    19. // 处理下拉框的变化
    20. handleCity = e => {
    21. this.setState({
    22. city: e.target.value
    23. })
    24. }
    25. // 处理复选框的变化
    26. handleChecked = e => {
    27. this.setState({
    28. isChecked: e.target.checked
    29. })
    30. }
    31. render() {
    32. return (
    33. <div>
    34. {/* 文本框 */}
    35. <input type="text" value={this.state.txt} onChange={this.handleChange} />
    36. <br/>
    37. {/* 富文本框 */}
    38. <textarea value={this.state.content} onChange={this.handleContent}>textarea>
    39. <br/>
    40. {/* 下拉框 */}
    41. <select value={this.state.city} onChange={this.handleCity}>
    42. <option value="sh">上海option>
    43. <option value="bj">北京option>
    44. <option value="gz">广州option>
    45. select>
    46. <br/>
    47. {/* 复选框 */}
    48. <input type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked} />
    49. div>
    50. )
    51. }
    52. }

    2、非受控表单元素

    (1)由DOM控制

    (2)在constructor中React.createRef()

    1. class App extends React.Component {
    2. constructor() {
    3. super()
    4. // 1.创建ref
    5. this.txtRef = React.createRef()
    6. }
    7. // 获取文本框的值
    8. getTxt = () => {
    9. // 3. 通过ref对象来获得表单元素的值
    10. console.log('文本框值为:', this.txtRef.current.value);
    11. }
    12. render() {
    13. return (
    14. <div>
    15. // 2.将创建好的 ref 对象添加到表单元素中
    16. <input type="text" ref={this.txtRef} />
    17. <button onClick={this.getTxt}>获取文本框的值button>
    18. div>
    19. )
    20. }
    21. }

    五、通信

    1、父传子:属性值

    (1)父组件提供传递的数据

    (2)给子组件标签添加属性,值为state中的数据

    (3)子组件中通过props接收父组件中传过来的数据

    1. // 子组件
    2. export class tab extends Component {
    3. render() {
    4. return (
    5. <div>
    6. {this.props.msg}
    7. div>
    8. )
    9. }
    10. }
    11. // 父组件
    12. export class exer extends Component {
    13. state = {
    14. mesg: 'msg',
    15. }
    16. render() {
    17. return (
    18. <div>
    19. <tab msg={this.state.mesg} />
    20. div>
    21. )
    22. }
    23. }

    2、子传父:回调函数

    (1)父组件提供一个回调函数,用于接收数据

    (2)将函数作为属性的值,传给子组件

    (3)子组件通过props调用回调函数

    (4)将子组件中的数据作为参数传给回调函数

    1. // 子组件
    2. export class tab extends Component {
    3. render() {
    4. return (
    5. <div>
    6. <p
    7. onClick={() =>{
    8. this.props.changeMes("返回数据")
    9. }
    10. }
    11. >tabp>
    12. div>
    13. )
    14. }
    15. }
    16. // 父组件
    17. export class exer extends Component {
    18. state = {
    19. mesg: 'msg',
    20. }
    21. changemes = (newmsg) => {
    22. this.state({
    23. meg: newmsg
    24. })
    25. }
    26. render() {
    27. return (
    28. <div>
    29. <tab changeMes={this.changemes} />
    30. div>
    31. )
    32. }
    33. }

    3、在父组件中对子组件进行ref标记,可以获取到子组件的引用

    4、中间人模式:由父组件充当中间人,利用子传父+父传子模式完成

    (1)公共父组件提供共享状态,提供共享状态的方法

    (2)要接收数据状态的子组件通过 props 接收数据

    (3)要传递数据状态的子组件通过props接收方法,调用方法传递数据

    5、发布订阅模式

    1. let  bus = {
    2.    list:[],   //存放订阅者
    3.    //订阅者
    4.    subscrible(cb){
    5.       this.list.push(cb);
    6.    },
    7.    //发布者
    8.    publish(text){
    9.       this.list.forEach(cb => cb &&  cb(text))
    10.    }
    11. }

    6、context状态树传参(官方提供)

    (1)父组件

    1. <GlobalContext.Provider   value = { {a:1,b:2} }>
    2.       <Child1>Child1>
    3.       <Child2>Child2>
    4. GlobalContext.Provider>

    (2)子组件

    1. <GlobalContext.Consumer>
    2.    {
    3.       value =>{
    4.          return  (
    5.             <div>子组件{value}div>
    6.          )
    7.       }
    8.    }
    9. GlobalContext.Consumer>

    注意:value是固定的关键词

    7、Redux:这个后面会讲到

    六、插槽

    1、默认形式

    (1)父组件

    1. <Child>
    2.    

      插入任意内容

    3. Child>

    (2)子组件

    1. return (
    2.     <div>
    3.         <p>子组件内部标签p>
    4.         {/* 以下内容是插槽内容,外部代码在此进行替代 */}
    5.         {this.props.children}
    6.         {/* 固定写法 */}
    7.     div>
    8. )

    2、按顺序插入

    1. 父组件:
    2. <Child>
    3.    

      西游记

    4.    

      红楼梦

    5.    

      水浒传

    6. Child>
    7. 子组件Child
    8. return (
    9.     <div>
    10.         {this.props.children[0]}
    11.         {this.props.children[1]}
    12.         {this.props.children[2]}
    13.     div>
    14. )

    3、作用

    (1)提高代码的复用性

    (2)一定程度上减少父子通信

    七、生命周期(钩子函数)

    1、初始化阶段

    (1)componentWillMount

         <1>组件即将挂载,render之前最后一次修改state的机会

         <2>常用于:state的初始化

         <3>注意:如果有警告,可使用UNSAFE_componentWillMount

    (2)render(渲染):只能访问props与state,不能修改state及进行dom输出

    (3)componentDidMount

         <1>成功执行完毕render并完成dom节点的渲染,可以对dom修改

         <2>常用于:axios请求,订阅函数调用,计时器,dom操作

    2、运行中阶段

    (1)componentWillReceiveProps(nextProps)

         <1>父组件修改属性触发

         <2>最先获取父组件传来的属性,可以在这里进行axios请求或者其他逻辑处理

         <3>注意:如果有警告,可使用UNSAFE_componentWillReceiveProps

    (2)shouldComponentUpdate(nextProps,nextState)

         <1>返回false,会阻止render的调用

         <2>参数是被修改之后的新的属性及状态

    (3)componentWillUpdate

         <1>组件将要更新,不能修改该属性及状态

         <2>注意:如果有警告,可使用UNSAFE_componentWillUpdate

    (4)render(渲染):只能访问props与state,不能修改state及进行dom输出

    (5)componentDidUpdate(preProps,preState)

         <1>可以修改dom

         <2>参数是被修改之前的属性及状态

    3、销毁阶段

    (1)componentWillUnmount

    (2)在删除组件前进行清理工作

    注意:写在前边:只有类组件(函数组件需要hooks支持)

    八、新生命周期(推荐)

    1、老钩子问题

    componentWillmount会重复触发多少次,如果绑定事件无法解绑

    2、static getDeriveStateFromProps(nextProps,nextState)

    (1)将属性转为状态

    (2)挂载之前于更新会执行

    (3)返回一个状态对象

  • 相关阅读:
    一键PDF转Word,PP-Structurev2文档分析模型深度解读!
    URP下的OffScreen Particle Render
    babylon.js gltf scene hierarchy
    MIT6.s081/6.828 lectrue4:page tables 以及 Lab3 心得
    服了,一个ThreadLocal被问出了花
    java-net-php-python-ssh电动车销售系统计算机毕业设计程序
    MySQL-锁
    100000开发的系统,执意重构钱多执念?
    阿里云将投入70亿元建国际生态、增设6大海外服务中心
    归并排序详解
  • 原文地址:https://blog.csdn.net/m0_62697897/article/details/127758700