網(wǎng)站首頁 編程語言 正文
組件間傳值
props
父傳子:通過自定義屬性向子組件傳值,值可以是任何類型
子傳父:通過父組件把方法傳給子組件,子組件調(diào)用傳過去的方法完成傳值
注:
1.定義方法時(shí)盡可能的去使用箭頭函數(shù)定義
2.調(diào)用時(shí),盡可能的寫小括號(hào)
父組件中的方法 // 成員方法 箭頭函數(shù)來定義,這樣就沒有this指向問題 setNum = (n = 1) => this.setState(state => ({ num: state.num + n })) <Child num={num} setNum={this.setNum} /> 子組件中 <button onClick={() => setNum(2)}>+++++</button> 子去修改父傳過來的數(shù)據(jù),props它是單向數(shù)據(jù)流,子不能直接去修改
ref
- 父子間傳值:通過ref引用對象完成對于【類組件】之間通信
-
this.childRef.current
得到當(dāng)前Child組件的實(shí)例對象
childRef = createRef() <Child ref={this.childRef} /> ++++++++++++++++++++++++++++++++ this.setState({ title: this.childRef.current.state.title }) this.childRef.current.setState({ title: this.state.msg }) this.childRef.current.setTitle(this.state.msg)
狀態(tài)提升
此方案用來解決兄弟組件間的傳值問題,就是把共用的狀態(tài)信息提升到父組件狀態(tài)中。
import React, { Component } from 'react' class Child1 extends Component { render() { let { setMsg } = this.props return ( <div> <input type="text" onChange={e => setMsg(e.target.value)} /> </div> ) } } class Child2 extends Component { render() { let { msg } = this.props return ( <div> <h3>{msg}</h3> </div> ) } } class App extends Component { state = { msg: '' } setMsg = msg => this.setState({ msg }) render() { return ( <div> <h1>{this.state.msg}</h1> <Child1 setMsg={this.setMsg} /> <Child2 msg={this.state.msg} /> </div> ) } } export default App
或者:
class App extends Component { state = { msg: '', setMsg: msg => this.setState({ msg }) } render() { let { msg, setMsg } = this.state return ( <div> <h1>{msg}</h1> {/* <Child1 setMsg={setMsg} /> */} {/* <Child2 msg={msg} /> */} <Child1 {...this.state} /> <Child2 {...this.state} /> </div> ) } }
跨組件通信
context實(shí)現(xiàn)在跨組件通信,一般用于自定義組件
- context一個(gè)項(xiàng)目中可以有N個(gè),但是一般情況下我們使用它,都是把它放在App組件中,一個(gè)項(xiàng)目一個(gè)。
- 因?yàn)镃ontext會(huì)讓組件變得不純粹,因?yàn)橐蕾嚵巳肿兞俊K赃@決定了Context一般不會(huì)大規(guī)模的使用。所以一般在一個(gè)組件中使用一個(gè)Context就好。
- context實(shí)現(xiàn)在跨組件通信,一般用于自定義組件所用
- context綁定消費(fèi)是一定是一個(gè)對象
import { createConext } from 'react' const ctx = createContext() const { Provider, Consumer } = ctx export { ctx as default, Provider, Consumer }
- Provider,Consumer 都是組件
- Provider 生產(chǎn)數(shù)據(jù)的組件
- Consumer 消費(fèi)的組件
導(dǎo)入
在App組件中生產(chǎn)數(shù)據(jù),這樣下面的子孫組件就可以調(diào)用此context
對象來消費(fèi)數(shù)據(jù),value屬性就是生產(chǎn)的數(shù)據(jù)源
app.jsx
import Child from './pages/Child' import { Provider } from './context/appContext' class App extends Component { state = { name: "張三", setName: (name) => this.setState({ name }), }; ======================================================= render() { return ( <div> {/* value屬性就是生產(chǎn)的數(shù)據(jù)源 */} <Provider value={this.state}> <Child /> </Provider> </div> ); } }
child.jsx文件
兩種方法來消費(fèi)(獲取)數(shù)據(jù)
類組件中context還可以換一個(gè)方案來消費(fèi),定義好后,就可以通過成員屬性 this.context來獲取數(shù)據(jù)
方式1:通過組件消費(fèi):
由于Consumer的特性,里面的代碼必須是這個(gè)函數(shù)的返回值。
// 假設(shè)現(xiàn)在當(dāng)前組件是App組件下面的很深的子孫組件 import ctx, { Consumer } from '../../context/appContext' ..... <Consumer>{state => <h3>{state.name}</h3>}</Consumer>
方式2:通過綁定靜成屬性來消費(fèi)
首先用static 來聲明contextType
static contextType = ctx
這樣在運(yùn)行是就會(huì)獲得一個(gè)新的屬性,我們來接收它,這樣consumer就可以完全不再使用了。
const battery = this.context
// 假設(shè)現(xiàn)在當(dāng)前組件是App組件下面的很深的子孫組件 import ctx, { Consumer } from '../../context/appContext' static contextType = ctx const battery = this.context //就可以通過成員屬性 this.context來獲取數(shù)據(jù) ..... <h3>{this.context.name}</h3> <h3>{battery.name}</h3>
原文鏈接:https://niuniu.blog.csdn.net/article/details/126981324
相關(guān)推薦
- 2024-02-29 Android系統(tǒng)中g(shù)etCacheDir()、getFilesDir()、getExternalF
- 2021-12-14 HTML+jQuery實(shí)現(xiàn)簡單的登錄頁面_jquery
- 2022-06-27 ABP引入Dapper框架的創(chuàng)建使用_實(shí)用技巧
- 2023-03-03 一文詳解Go?Http?Server原理_Golang
- 2022-06-23 Python在畫圖時(shí)使用特殊符號(hào)的方法總結(jié)_python
- 2024-04-03 linux系統(tǒng)配置nginx兩套以上的前端
- 2022-12-26 python-httpx的使用及說明_python
- 2022-07-12 mongoDB替換replace某個(gè)字段的部分內(nèi)容
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支