React組件傳值,父傳子,子傳父,父調用子方法,子調用父方法,使用redux情況下如何調用子方法

該篇文章所使用的方法,是react提供的父子頁面數據交互,如果熟練掌握react-redux,可以完全省略以下內容。。。
個人還是比較喜歡這種直接傳值方法的,比較直接,簡單易懂(主要是因為一開始redux運用的不熟練)在一些大型的項目開發當中,一定會用到redux,請各位同學要好好練習,今后會對redux做一個專門的整理。

  • 父組件的值傳遞給子組件
class TodoList extends Component {
    constructor(props) {
        super(props);
        this.state = {
            inputValue: '傳我,傳我'
        }
    }
    render() {
        return (
            <Children childData={this.state.inputValue} /> //Children是子組件的名稱,childData是自己起的名字,inputValue是父組件state中定義的狀態
        )
    }
export default TodoList;

上面代碼中,我們需要先給子組件設置一個屬性,這個屬性名稱隨你喜好,然后把父組件state中的需要傳遞的數據和子組件的這個屬性綁定,綁定方法就是childData={this.state.inputValue},這樣父組件中的工作就完成了。然后是子組件中如何使用,如下:

class Children extends Component {

    constructor(props) {
        super(props)
    }
    render() {
        return (
            <div onClick={this.handleClick}>
                <p> 點我觸發事件</p>
            </div>
        )
    }
    handleClick = () => {
        console.log(this.props.childData);
    }
}

通過props拿到之前在父頁面中綁定的屬性。

  • 父組件的方法,怎么傳遞給子組件
class TodoList extends Component {
   constructor(props) {
       super(props);
       this.state = {
           inputValue: '傳我,傳我'
       }
   }
   render() {
       return (
               <div onClick={this.onClick}>點擊觸發</div>
               <Children
                   childData={this.state.inputValue}
                   childClick={this.onClick}
               /> //Children是子組件的名稱,childData是自己起的名字,inputValue是父組件state中定義的狀態
           )
   }
   onClick = () => {
       console.log('父組件事件觸發');
   }
export default TodoList;

子組件中使用父組件的方法時,同樣的需要從props中拿到綁定好的方法,下面為子組件

render() {
        return (
            <div onClick={this.handleClick}>
                點擊觸發
            </div>)
    }
    handleClick() {
        let { childClick } = this.props;
        childClick()
    }
  • 說完父傳子,該子傳給父了

還是上面的代碼,子傳給父只要把執行父方法的時候,把要傳遞的數據,當作參數,傳遞給父就可以了

render() {
        return (
            <div onClick={this.handleClick}>
                點擊觸發
            </div>)
    }
    handleClick() {
        let { childClick } = this.props;
        childClick(this.state.data)//這個this.state.data就是存在子里面的數據,要傳遞給父
    }

父組件別忘了在自己的方法里,接收一下子傳遞過來的參數


class TodoList extends Component {
    constructor(props) {
        super(props);
        this.state = {
            inputValue: '傳我,傳我'
        }
    }
    render() {
        return (
                <div onClick={this.onClick}>點擊觸發</div>
                <Children
                    childData={this.state.inputValue}
                    childClick={this.onClick}
                /> 
            )
    }
    onClick = (data) => {
        console.log('子傳遞過來的數據', data);//這里接收了子傳遞過來的數據
    }
export default TodoList;

OK,父子間傳值,傳方法,Lv1,已經學會了,接下來Lv2

  • 子組件的方法怎么傳遞給父組件

這個需要分類討論了,在沒有使用redux的時候,情況如下

class TodoList extends Component {
    constructor(props) {
        super(props);
        this.state = {
            inputValue: '傳我,傳我'
        }
    }
    render() {
        return (
                <Children onRef={this.onRef} /> //可以簡寫成onRef={(el) => this.onRef = el 寫成這種形式,下方的onRef也可以省略了

                <button onClick={this.click} >click</button>
            )
    }
    onRef = () => {
        this.Children = ref;
    }
    onClick = () => {
        this.Children.childClick()
    }
export default TodoList;

下面是子組件,需要先通過父組件中綁定的onRef,把子組件傳遞過去

componentDidMount(){
        this.props.onRef(this)
    }

react中this表示的是組件本身,這里是通過執行父組件的onRef方法,把this(子組件)傳遞給父組件,然后在父組件中就可以調用了,上面生命后期表示,在組件完成掛載后,去把this傳給父

  • 最后一個問題,一般項目或者實際開發中,都會使用到react-redux來管理狀態,在使用了redux后,上面的父調子方法就不管用了,那么怎么解決

導致上面哪種方法失效的原因是redux屬于高階組件,他會包裹住我們的子組件,導致ref無法獲取,解決方法是在連接器的參數上設置一下

//使用了redux后會設置連接器
export default connect(stateToProps, null, null, { withRef: true })(Children)
//正常暴露組件的形式
export default Children

注意:這個是子組件最下面的連接器,因為使用了redux,我們的子組件不是直接被暴露出去的,所以導致父組件無法直接通過onRef獲取到
當然withRef開啟后,還是不能直接使用,父組件在調用子方法的時候,需要增加如下使用

onClick = () => {
    this.Children.getWrappedInstance.childClick();
}

上面就是父子組件之間,傳值的所有方法了,最后一種方法可能不太好記憶,我個人最開始是記住子組件用了redux之后,就會比較皮,因為他能獲取到所有的state,所以會不服管教,這時候需要在他的屁股上(最下方)蓋一個戳兒,告訴他,你得乖乖的,讓父親指揮你,讓你干嘛你干嘛,當然父親手里得拿一個雞毛撣子(getWrappedInstance)才能震懾住他,因為他蓋完戳兒了還是很皮,還是能獲取到所有state
當你弄明白redux的使用規則的時候,就不用這么麻煩的記憶了,可能有時候項目比較簡單,沒必要使用到redux,完全可以只用父子傳值搞定。

推薦大家看一下張培小姐姐的關于withRef的使用,能更好理解
http://www.lxweimin.com/p/b567056c9d09

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容