首页 > 其他分享 >React学习笔记21-非父子通信(状态提升)

React学习笔记21-非父子通信(状态提升)

时间:2023-11-08 10:24:26浏览次数:26  
标签:21 detail 笔记 React item 详情 props 组件 getFilmDetail

1.状态提升(中间人模式)的定义

React中的状态提升概括来说,就是将多个组件需要共享的状态提升到它们最近的父组件 上.在父组件上改变这个状态然后通过props分发给子组件。

2.状态提升的使用

简单讲解一下下面的代码,下面模拟了一个电影列表和详情页面。

进行通信的是列表的item和详情组件。

可以看到先在父组件APP中进行ajax请求拿到所有的列表item数据,然后通过父传子传给item,

同时传递一个getDetail函数给item组件作为它点击事件的回调。这个方法接受了一个存放详情信息的形参。

然后在父组件定义一个State detail 用来传递给详情组件作为它的属性来渲染详情信息。

getDetail方法会用接受的行参数来进行setState改变detail,这时就会重新执行render。

详情信息就从item传递到了详情。实现了兄弟组件的通信。

可以看到在中间人模式下,兄弟组件的所有属性都是由父组件来分发的。并且都能通过父组件的setState来控制。

所以说本质上中间人模式也就是父子通信的应用。

import React, { Component } from 'react'
import axios from 'axios'
export default class App extends Component {
    constructor() {
        super()
        this.state = {
            filmList: [],
            detail: ""
        }

    }
    componentDidMount() {
        axios.get('http://localhost:3000/filmlist.json').then(res => {
            console.log(res.data.data.films)
            this.setState({
                filmList: res.data.data.films
            })
        })
    }
    render() {
        return (
            <div>
                {this.state.filmList.map(item => {
                    return (
                        <FilmItem getFilmDetail={
                            (detail) => {
                                /* 
                                父组件接收到之后,执行this.getFilmDetail(detail)
                                更新状态,然后分发给FilmDetail组件,
                                通过父组件为中间人模式实现兄弟传参
                                */
                                this.getFilmDetail(detail)
                            }
                        } {...item} key={item.filmId}></FilmItem>
                    )
                })}
                <FilmDetail detail={this.state.detail} ></FilmDetail>
            </div>
        )
    }
    getFilmDetail(detail) {
        console.log(detail)
        this.setState({
            detail: detail
        })
    }
}
/* 受控组件 */
class FilmItem extends Component {
    render() {
        console.log(this.props);
        return (
            <div style={{ overflow: 'hidden', padding: '10px' }} onClick={
                () => {
                    /* 
                    先将detail通过回调函数传给父组件
                    */
                    console.log(this.props.synopsis)
                    this.props.getFilmDetail(this.props.synopsis)
                }
            }>
                <img style={{ width: '100px', float: "left" }} src={this.props.poster} alt="" />
                <h4>{this.props.name}</h4>
                <h5>观众评分:{this.props.grade}</h5>

            </div>
        )
    }
}

class FilmDetail extends Component {
    render() {
        return (
            <div style={{ position: 'fixed', right: '0', top: '100px', background: 'yellow', width: "200px", padding: "10px" }}
            >{this.props.detail}</div>
        )
    }
}

 

标签:21,detail,笔记,React,item,详情,props,组件,getFilmDetail
From: https://www.cnblogs.com/SadicZhou/p/17816758.html

相关文章

  • React学习笔记20-父子通信(子传父)
    在React中子组件给父组件传参通过回调函数来进行。父组件给子组件传递一个回调函数作为属性。子组件在需要传递参数的地方调用父组件传递的回调函数即可。importReact,{Component}from'react'classNavbarextendsComponent{render(){return(......
  • 笔记本不接电源屏幕色彩失真
    win+Q,直接搜:“英特尔显卡控制中心” 把功率下的电源设置关闭即可。  翻译搜索复制......
  • React前后端如何同构,防止重复渲染
    什么叫前后端同构?为了解决某些问题(比如SEO、提升渲染速度等)react提供了2个方法在服务端生成一个HTML文本格式的字符串。在得到了这个HTML格式的字符串之后,通常会将其组装成一个页面直接返回给用户的浏览器。到这里,服务端的活已经干完了,然后就是浏览器这边干活。浏览器拿到HTML......
  • C++基础随笔记录
    函数-值传递函数调用时,实参传递给形参。值传递时,形参改变,不会改变实参函数-4种形式无参无返有参无返无参有返有参有返函数-声明作用:告诉编译器函数名称以及如何调用函数。函数的主体可以单独定义。函数可以多次被声明,但是函数的定义只有一......
  • 笔记本安装打印程序
    1.输入网址:https://www.hp.com/2.点击支持-->软件与驱动程序3.点击打印机4.输入型号5.选择相应的6.7.8.9.直接点击下一步10.选好型号之后点击下一步11.之后把打印机开机连接到电脑就ok了......
  • 实验三_OOP_张文瑞_202213260018
    任务1源代码:11#pragmaonce2233#include<iostream>44usingstd::cout;55usingstd::endl;6677classPoint{88public:99Point(intx0=0,inty0=0);1010~Point()=default;11111212intget_x()......
  • 《信息安全系统设计与实现》第十周学习笔记
    第六章信号和信号处理信号和中断“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。进程:一个“进程”就是一系列活动广义的“进程”包括:从事日常......
  • sharding分表应用笔记(一)——分表数据源配置
    sharding分表应用笔记(一)——分表数据源配置目录sharding分表应用笔记(一)——分表数据源配置1前言2配置2.1相关依赖2.2命名空间配置2.2.1引入sharding命名空间2.2.2物理数据源配置2.2.3分表数据源配置3外部链接1前言应用背景:物理数据源只有一个;对于部分数据量大的表实行......
  • openGauss学习笔记-117 openGauss 数据库管理-设置数据库审计-查看审计结果
    openGauss学习笔记-117openGauss数据库管理-设置数据库审计-查看审计结果117.1前提条件审计功能总开关已开启。需要审计的审计项开关已开启。数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。数据库各个节点审计日志单独记录。......
  • 21 个最佳 Javascript IDE 和代码编辑器 [CSS、HTML、JavaScript]
    这是我们挑选的21个最佳JavaScriptIDE和源代码编辑器。目录什么是IDE选择正确的开发环境时要寻找什么?免费的最佳JavascriptIDE最佳高级JavascriptIDE结论:最佳JavaScriptIDE是哪个?常见问题解答:最佳JavascriptIDE如今,Javascript在前端开发中越来越流行。您......