React 基础学习笔记【四】

Context 共享数据

为避免太多层数据没必要的props传递,16.3版本设计了context组件数据共享

【案例】点击不同主题按钮切换下方区域样式

1.在src下新建theme-context.js组件,用于存放共享数据(中转站)

theme-context.js组件代码如下,定义一个Context将它导出,供子组件导入

import React from 'react'

const ThemeContext =React.createContext()



export default ThemeContext复制代码

 

2.父组件引入import ThemeContext from './theme-context'

 

3.在父组件里,将要传值的视图板块,用<ThemeContext>标签包裹起来,

其中两个a标签是要点击变换的按钮,

render() {
  return (
      <ThemeContext.Provider>
    <div className="App">
        <a href="#theme-switcher"
           className="btn btn-light"
        >浅色主题</a>
        <a href="#theme-switcher"
           className="btn btn-secondary"
        >深色主题</a>
    </div>
      </ThemeContext.Provider>
  );复制代码

4.在父组件里,定义共享数据themes,有两条数据light和dark,数据里分别是css样式

const themes = {
  light:{
    className:'btn btn-primary',
      bgColor:'#eeeeee',
      color:'#000'
  },
    dark:{
    className: 'btn btn-light',
        bgColor: '#222222',
        color:'#fff'
    },
}复制代码

5.在components文件夹里新建ThemeBar.js组件,用于展示样式变换

首先在此组件引入import ThemeContext from '../theme-context'

将组件要接收共享数据的模块用<ThemeContext>标签包裹,并.Consumer导入

return(
    <ThemeContext.Consumer>
        {
            theme =>{
                //console.log(theme)
                return(
                   <div
                   className="alert mt-5"
                   }}
                   >
                       样式区域
                       <button>
                            样式按钮
                       </button>
                   </div>
                )
            }
        }
    </ThemeContext.Consumer>
)复制代码

6.在父组件的标签里设置value将themes数据导出,

给a标签添加点击事件changTheme,参数分别为light和dark

  <ThemeContext.Provider value={themes[this.state.theme]}>
  <div className="App">
      <a href="#theme-switcher"
         className="btn btn-light"
        onClick={()=>{this.changeTheme('light')}}
      >浅色主题</a>
      <a href="#theme-switcher"
         className="btn btn-secondary"
         onClick={()=>{this.changeTheme('dark')}}
      >深色主题</a>
    <ThemeBar/>
  </div>
    </ThemeContext.Provider>
);复制代码

7.在state中设置theme默认为light样式

constructor(props){
  super(props)
    this.state = {
        theme:"light"
    }
}复制代码

8.给changTheme事件绑定this

constructor(props){
  super(props)
    this.state = {
        theme:"light"
    }
    this.changeTheme = this.changeTheme.bind(this)
}复制代码

9.定义changTheme事件,点击哪个a切换至相应参数下的数据

changeTheme(theme){
  this.setState({
      theme,
  })
}复制代码

10.在展示样式的组件中,给div绑定style,获取父元素theme数据下的bgColor等数据

return(
    <ThemeContext.Consumer>
        {
            theme =>{
                //console.log(theme)
                return(
                   <div
                   className="alert mt-5"
                   style={{ backgroundColor:theme.bgColor,
                   color:theme.color,
                   }}
                   >
                       样式区域
                       <button className={theme.className}>
                            样式按钮
                       </button>
                   </div>
                )
            }
        }
    </ThemeContext.Consumer>
)复制代码

就做到了一个视图展示层  共享同一份  不同元素的数据

点击切换组件  修改同一个视图模板下的不同css样式

 

所有代码:

App.js下:

import React, { Component } from 'react';
import './App.css';
import ThemeBar from './components/ThemeBar'
import ThemeContext from './theme-context'

const themes = {
  light:{
    className:'btn btn-primary',
      bgColor:'#eeeeee',
      color:'#000'
  },
    dark:{
    className: 'btn btn-light',
        bgColor: '#222222',
        color:'#fff'
    },
}

class App extends Component {
  constructor(props){
    super(props)
      this.state = {
          theme:"light"
      }
      this.changeTheme = this.changeTheme.bind(this)
  }

    changeTheme(theme){
      this.setState({
          theme,
      })
    }

  render() {
    return (
        <ThemeContext.Provider value={themes[this.state.theme]}>
      <div className="App">
          <a href="#theme-switcher"
             className="btn btn-light"
            onClick={()=>{this.changeTheme('light')}}
          >浅色主题</a>
          <a href="#theme-switcher"
             className="btn btn-secondary"
             onClick={()=>{this.changeTheme('dark')}}
          >深色主题</a>
        <ThemeBar/>
      </div>
        </ThemeContext.Provider>
    );
  }
}

export default App;
复制代码

ThemeBar.js下:展示样式变换组件

import React from 'react'
import ThemeContext from '../theme-context'

const ThemeBar = ()=>{
    return(
        <ThemeContext.Consumer>
            {
                theme =>{
                    //console.log(theme)
                    return(
                       <div
                       className="alert mt-5"
                       style={{ backgroundColor:theme.bgColor,
                       color:theme.color,
                       }}
                       >
                           样式区域
                           <button className={theme.className}>
                                样式按钮
                           </button>
                       </div>
                    )
                }
            }
        </ThemeContext.Consumer>
    )
}

export default ThemeBar复制代码

theme-context.js下:

 

import React from 'react'

const ThemeContext =React.createContext()



export default ThemeContext复制代码

 

最终样式:默认为light主题,点击对应按钮切换对应主题

 

内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值