惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
S
SegmentFault 最新的问题
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
DataBreaches.Net
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
宝玉的分享
宝玉的分享
腾讯CDC
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
T
The Exploit Database - CXSecurity.com
T
The Blog of Author Tim Ferriss
V
V2EX
S
Securelist
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Y
Y Combinator Blog
P
Proofpoint News Feed
T
Tor Project blog
AWS News Blog
AWS News Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
博客园 - 聂微东
T
Threat Research - Cisco Blogs
B
Blog
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
N
News and Events Feed by Topic
博客园 - 司徒正美
H
Help Net Security
C
Cisco Blogs
C
Check Point Blog
S
Secure Thoughts

博客园 - 折翼的飞鸟

微信小程序分享图片显示自定义内容 Taro4.x 引入 taro-ui 组件库 Taro4.x引入redux报错:TypeError: middleware is not a function uniapp+vue3 微信小程序使用mqtt通信 uniapp+vue3 在App.vue中如何设置全局调用方法 Taro 在页面中import包、组件、样式文件的顺序自定义规则 Taro优化VirtualList虚拟列表组件 Taro 引入moment.js打包过大 Taro 打包体积分析 React:消息订阅(subscribe)-发布(publish)机制 Taro 插件引入 Taro: chooseLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json Taro 支付宝小程序Page页获取小程序启动时的参数 Taro 主包vendors.js文件过大 Taro自定义Tabbar Taro 微信转支付宝小程序: 问题八 TypeError: Function(...) is not a function Taro微信转支付宝小程序:问题七 引入的文件图片文件名不能有@符号 Taro微信转支付宝小程序:问题六 同时编译微信小程序和支付宝小程序 Taro微信转支付宝小程序:问题五 编译时没有报错,工具中却莫名奇妙的错误提示
React中 state值根据props传入值变化的静态方法 getDerivedStateFromProps
折翼的飞鸟 · 2026-03-03 · via 博客园 - 折翼的飞鸟

  在react中,如果state值需要根据props传的值进行改变,除了 useEffectcomponentDidUpdate 外,是否有静态方法可以让 state 直接根据 props 变化来更新,这个方法其实是类组件专属的 getDerivedStateFromProps

  这是 React 提供的静态生命周期方法,专门用于实现「从 props 派生 state」的需求,也是官方推荐的、更规范的 state 随 props 变化的方式(相比 componentDidUpdate 更可控)。

 1. 基本特性

  • 静态方法:不能使用 this,只能通过参数接收 propsstate
  • 触发时机:
    • 组件挂载时(首次渲染);
    • 组件接收新 props 时;
    • 父组件重新渲染时;
    • 调用 setStateforceUpdate 时;
  • 返回值:返回一个对象(用于更新 state),或 null(不更新 state)。

 总结

  1. React 中让 state 随 props 变化的静态方法是类组件的 static getDerivedStateFromProps,它是纯函数,专门用于从 props 派生 state;
  2. 该方法返回更新的 state 对象(或 null),触发时机包括组件挂载、接收新 props 等;
  3. 函数组件中无此静态方法,推荐用 useEffect + 依赖数组实现等价逻辑,类组件中也可根据是否需要副作用选择该方法或 componentDidUpdate
import React, { Component } from 'react';

class ColorPicker extends Component {
  // 初始 state
  state = {
    selectedColor: '#FF4444', // 默认颜色
    tempColor: '' // 派生的临时颜色
  };

  // 核心:静态方法,从 props 派生 state
  static getDerivedStateFromProps(nextProps, prevState) {
    // 对比新 props 和旧 state,判断是否需要更新 state
    if (nextProps.defaultColor !== prevState.selectedColor) {
      // 返回需要更新的 state 字段
      return {
        selectedColor: nextProps.defaultColor, // 用 props 覆盖 state
        tempColor: `${nextProps.defaultColor}-temp` // 派生额外 state
      };
    }
    // 不需要更新时返回 null
    return null;
  }

  // 手动切换颜色
  handleChangeColor = (color) => {
    this.setState({ selectedColor: color });
  };

  render() {
    const { selectedColor, tempColor } = this.state;
    return (
      <div>
        <div style={{width: '60px', height: '60px', backgroundColor: selectedColor, margin: '10px 0'}} />
        <p>当前选中颜色(来自 props/state):{selectedColor}</p>
        <p>派生的临时颜色:{tempColor}</p>
        <button onClick={() => this.handleChangeColor('#0099CC')}>切换为蓝色</button>
      </div>
    );
  }
}

// 父组件使用
class Parent extends Component {
  state = {
    parentColor: '#FF4444'
  };

  // 模拟 props 变化
  changeParentColor = () => {
    this.setState({ parentColor: '#FF9900' });
  };

  render() {
    return (
      <div>
        <button onClick={this.changeParentColor}>父组件修改默认颜色</button>
        <ColorPicker defaultColor={this.state.parentColor} />
      </div>
    );
  }
}

export default Parent;