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

推荐订阅源

T
Tenable Blog
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
H
Help Net Security
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
量子位
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
AI
AI
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
U
Unit 42
V2EX - 技术
V2EX - 技术
MongoDB | Blog
MongoDB | Blog
Schneier on Security
Schneier on Security
博客园 - Franky
H
Heimdal Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
B
Blog RSS Feed
N
News | PayPal Newsroom
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
雷峰网
雷峰网

博客园 - 折翼的飞鸟

微信小程序分享图片显示自定义内容 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;