1. 程式人生 > 程式設計 >React 非父子元件傳參的例項程式碼

React 非父子元件傳參的例項程式碼

React 是一個用於構建使用者介面的 javascript 庫。

React 主要用於構建UI,很多人認為 React 是 MVC 中的 V(檢視)。

React 起源於 Facebook 的內部專案,用來架設 Instagram 的網站,並於 2013 年 5 月開源。

React 擁有較高的效能,程式碼邏輯非常簡單,越來越多的人已開始關注和使用它。

React 特點

1.宣告式設計 −React採用聲明範式,可以輕鬆描述應用。

2.高效 −React通過對DOM的模擬,最大限度地減少與DOM的互動。

3.靈活 −React可以與已知的庫或框架很好地配合。

4.jsX − JSX 是 javaScript 語法的擴充套件。React 開發不一定使用 JSX ,但我們建議使用它。

5.元件 − 通過 React 構建元件,使得程式碼更加容易得到複用,能夠很好的應用在大專案的開發中。

6.單向響應的資料流 − React 實現了單向響應的資料流,從而減少了重複程式碼,這也是它為什麼比傳統資料繫結更簡單。

下面給大家介紹React 非父子元件傳參的例項程式碼,具體內容如下:

新版:跨級傳參最主要是避免每層賦值,也避免用到dva

import React from 'react'
const {Provider,Consumer} = React.createContext('default')
export default class ContextDemo extends React.Component {
    state={
        newContext:'createContext'
    }
  render() {
      const {newContext} = this.state
    return (
        <Provider value={newContext}>
            <div>
                <label>childContent</label>
                <input type="text" value={newContext} onChange={e=>this.setState({newContext:e.target.value})}/>
            </div>
           gCpcyOR
<Son /> </Provider> ) } } class Son extends React.Component{ render(){ return <Consumer> { (name)=> <div style={{border:'1px solid red',width:'60%',margin:'20px auto',textAlign:'center'}}> <p>子元件獲取到的內容:{name}</p> <Grandson /> </div> } </Consumer> } } class Grandson extends React.Component{ render(){ return <Consumer> { (name)=> <div style={{border:'1px solid red',textAlign:'center'}}> <p>孫子元件獲取到的內容:{name}</p> </div> } </Consumer> } }

老專案的方式也介紹一下,利用prop-types

import React from 'react'
import PropTypes from 'prop-types'
class ContextDemo extends React.Component {
    // getChildContext
    state={
        newContext:'createContext'
    }
    getChildContext(){
        return {value:this.state.newContext}
    }
  render() {
      const {newContext} = gCpcyORthis.state
    return (
            <div>
                <div>
                    <label>childContent</label&www.cppcns.comgt;
                    <input type="text" value={newContext} onChange={e=>this.setState({newContext:e.target.value})}/>
                </div>
                <Son />
            </div>
    )
  }
}
class Son extends React.Component{
    render(){
        return <div>
            <p>children:{this.context.value}</p>
        </div>
    }
}
Son.contextTypes = {
    value:PropTypes.string
}
ContextDemo.childContextTypes = {
    value:PropTypes.string
}
export default () => 
  <ContextDemo >
  
  </ContextDemo>

ref

import React from 'react'

// 函式元件也想拿到dom 通過 ref
const TargetFunction = React.forwardRef((pro程式設計客棧ps,ref)=>(
    <input type="text" ref={ref}/>
))
export default class FrodWordRefDemo extends React.Component {
  constructor() {
    super()
    this.ref = React.createRef()
  }

  componentDidMount() {
    this.ref.current.value = 'ref get input'
  }

  render() {
    return <TargetFunction ref={this.ref}>
    </TargetFunction>
  }
}

pubsub-js

import React from 'react'
import PubSub from 'pubsub-js'
export default class Bro extends React.Component{
    state = {
        value:''
    }

    render(){
        const {value} = this.state
        PubSub.subscribe('SOS',(res,data)=>{
            this.setState({
                value:data
            })
        })
        return (
            <div>
                我接受到了
                <h1>{value}</h1>
            </div>
        )
    }
}
import React from 'react'
import PubSub from 'pubsub-js'
export default class Children extends React.Component{
    state = {
        value:''
    }
    handelChange = (e) =>{
        this.setState({
            value:e.target.value
        })
    }
    send = () =>{
        const {value} = this.state
        PubSub.pugCpcyORblish('SOS',value)
    }
    render(){
        const {value} = this.state
        return (
            <div>
                <input type="text" value={value} onChange={this.handelChange}/>
                <button onClick={this.send}>傳送</button>
            </div>
        )
    }
}

到此這篇關於React 非父子元件傳參的例項程式碼的文章就介紹到這了,更多相關React 非父子元件傳參內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!