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的使用,能更好理解
https://www.jianshu.com/p/b567056c9d09

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容