react悬案,组件间通信巨坑

简介: react悬案,组件间通信巨坑

文章目录


  • 事情的起因是这样的, 在一个小业务中,需要使用到react开发,希望子组件通过父组件控制是否渲染,本来是一个很简单的业务,但是在实际开发确到处碰壁,比如父组件的值发生了变化,但是子组件收到的值与父组件发生变化的值却不一样,千古奇案。

当使用Vue开发的小菜鸟遇上了react的巨坑!!!

还是直接上代码吧

1. 父组件

import {
    Component
} from 'react';
import './RightClick.css';
import Add from '../Add/Add';
class RightClick extends Component{
    state = {
        show: false
    }
    componentDidUpdate(){
        console.log('R组件发生变化',this.state.show)
    }
    render(){
        return(
            <div id='box' >
                <ul id='menu'>
                    <li className='menuItem' onClick={ () => this.setState({show:true}) }>添加</li>
                </ul>
                <Add show={this.state.show}/>
            </div>
        )
    }
}
export default RightClick

2. 子组件

import {
    Component
} from 'react';
import propTypes from 'prop-types';
import './Add.css'
export default class Add extends Component{
    static propTypes = {
        show: propTypes.bool.isRequired
    }
    state = {
        show: this.props.show
    }
     componentDidUpdate(){
        console.log('show=',this.state.show)
    }
    render(){
        return(
            !this.state.show 
            ? null
            :
            <div className="add">
                <div className="val">
                    <label htmlFor='name'>名称:</label><input id='name' placeholder='请输入财物的名字' />
                    <br />
                    <label htmlFor='value'>价值:</label><input id='value' placeholder='请输入财物的价值'/>
                </div>
                <div className="btn">
                    <button >确认添加</button>
                     &nbsp;
                    <button onClick = {e=>this.setState({show:false})} >取消添加</button>
                </div>
            </div>
        )
    }
}

3. 期望结果

  • 通过父组件的点击事件更改state,触发组件更新,然后更新传给子组件的props

4. 实际结果




  • 讲道理的话,setState以及new props都是触发componentDidUpdate的,但是为什么,父子收的值不一样呢???

5.原因分析

6. 解决办法

  • 父组件直接传给子组件一个方法,子组件调用父组件的方法

7. 最后的代码

  • 父组件
import {
    Component
} from 'react';
import './RightClick.css';
import Add from '../Add/Add';
class RightClick extends Component{
    state = {
        show: false
    }
    render(){
        return(
            <div id='box' >
                <ul id='menu'>
                    <li className='menuItem' onClick={ () => this.setState({show:true}) }>添加</li>
                </ul>
                <Add show={this.state.show} change = {e=>{this.setState({show:false})}} />
            </div>
        )
    }
}
export default RightClick
  • 子组件
import {
    Component
} from 'react';
import propTypes from 'prop-types';
import './Add.css'
export default class Add extends Component{
    static propTypes = {
        show: propTypes.bool.isRequired,
        change: propTypes.func.isRequired
    }
    render(){
        return(
            !this.props.show
            ? null
            :
            <div className="add">
                <div className="val">
                    <label htmlFor='name'>名称:</label><input id='name' placeholder='请输入财物的名字' />
                    <br />
                    <label htmlFor='value'>价值:</label><input id='value' placeholder='请输入财物的价值'/>
                </div>
                <div className="btn">
                    <button >确认添加</button>
                     &nbsp;
                    <button onClick = {e=>this.props.change()} >取消添加</button>
                </div>
            </div>
        )
    }
}

未完待续。。。

相关文章
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
121 0
|
2月前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
54 11
React技术栈-组件间通信的2种方式
|
5月前
|
存储 前端开发 JavaScript
在React中有效地管理组件之间的通信和数据流
在React中有效地管理组件之间的通信和数据流
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
52 1
|
6月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
183 0
|
6月前
|
前端开发 应用服务中间件 数据库
react服务端组件
react服务端组件
52 0
|
6月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理
|
13天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
45 9
|
1月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
1月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具