美文网首页
4.组件通信-eventHub

4.组件通信-eventHub

作者: 阿鲁提尔 | 来源:发表于2019-02-18 23:14 被阅读0次

1.回顾

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/react/16.8.1/umd/react.production.min.js"></script>
    <script src="https://cdn.bootcss.com/react-dom/16.8.1/umd/react-dom.production.min.js"></script>
</head>
<body>
    <div id="app"></div>
    <script>
        class App extends React.Component{
            constructor(){
                super()
                this.state = {
                    message: '你好'
                }
            }
            changeMessage(){
                this.setState({
                    message: '真好'
                })
            }
            render(){
                return(
                    <div>hi
                        <Foo message={this.state.message} 
                        fn={this.changeMessage.bind(this)} />
                    </div>
                )
            }
        }

        function Foo(props){
            return (
                <p>我得到的message是{props.message}
                    <button onClick={props.fn}>click</button>
                </p>
            )
        }
        ReactDOM.render(<App/>,document.querySelector("#app"))
    </script>
</body>
</html>

2.使用eventHub实现通信

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/react/16.8.1/umd/react.production.min.js"></script>
    <script src="https://cdn.bootcss.com/react-dom/16.8.1/umd/react-dom.production.min.js"></script>
</head>
<body>
    <style>
        .root{
            display: flex;
            justify-content: center;
            align-items: center;
            border: 1px solid black;
            padding: 10px;
        }
        .papa{
            border: 1px solid grey;
            padding: 10px;
            margin: 10px;
        }
        .son{
            border: 1px solid grey;
            padding: 10px;
            margin: 10px 0;
        }
    </style>
    <div id="app"></div>
    <script>
        var money = {
            amount: 100000
        }

        var fnLists = {}
        // 发布订阅
        var eventHub = {
            trigger(eventName,data){
                let fnList = fnLists[eventName]
                if(!fnList){return}
                for(let i = 0;i<fnList.length;i++){
                    fnList[i](data)
                }
            },
            on(eventName,fn){
                if(!fnLists[eventName]){
                    fnLists[eventName] = []
                }
                fnLists[eventName].push(fn)
            }
        }

        var x = {  //管家
            init(){
                eventHub.on('我想花钱',function(data){
                    money.amount -= data
                    render()
                })
            }
        }
        x.init()
        // eventHub.on('我要用钱',function fn1(){})
        // eventHub.trigger('我要用钱',100)

        //button.on('click',function(data){data==='x'})  //订阅
        //button.trigger('click','x') //发布
        // click 事件名称


        class App extends React.Component{
            constructor(){
                super()
                this.state = {
                    money: money
                }
            }
            changeMessage(){
                this.setState({
                    message: '真好'
                })
            }
            render(){
                return(
                    <div className="root">
                        <BigPapa money={this.state.money} />
                        <YoungPapa money={this.state.money} />
                    </div>
                )
            }
        }

        class BigPapa extends React.Component{
            constructor(){
                super()
                // this.state={
                //     money: money
                // }
            }
            render(){
                return (
                    <div className="papa">大爸 {this.props.money.amount}
                        <Son1 money={this.props.money} />
                        <Son2 money={this.props.money} />
                    </div>
                )
            }
            
        }
        class YoungPapa extends React.Component{
            constructor(){
                super()
            }
            render(){
                return (
                    <div className="papa">二爸 {this.props.money.amount}
                        <Son3 money={this.props.money} />
                        <Son4 money={this.props.money} />
                    </div>
                )
            }            
        }
        class Son1 extends React.Component{
            constructor(){
                super()
            }
            render(){
                return (
                    <div className="son">儿子1 {this.props.money.amount}</div>
                )
            }
            
        }
        class Son2 extends React.Component{
            constructor(){
                super()
            }
            x(){
                // money.amount -= 100
                eventHub.trigger('我想花钱',100)
                // this.setState({
                //     money: money
                // })
            }
            render(){
                return (
                    <div className="son">儿子2 {this.props.money.amount}
                        <button onClick={()=>this.x()}>消费</button>
                    </div>
                )
            }
            
        }
        class Son3 extends React.Component{
            constructor(){
                super()
            }
            render(){
                return (
                    <div className="son">儿子3 {this.props.money.amount}</div>
                )
            }
        }
        class Son4 extends React.Component{
            constructor(){
                super()
            }
            render(){
                return (
                    <div className="son">儿子4 {this.props.money.amount}</div>
                )
            }

        }

        function render(){
            ReactDOM.render(<App/>,document.querySelector("#app"))
        }
        render()
    </script>
</body>
</html>

预览地址

相关文章

  • 4.组件通信-eventHub

    1.回顾 2.使用eventHub实现通信

  • vue非父子组件通信

    1.父组件传递数据给子组件 如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现通信. 所谓...

  • Vue: EventHub 和 Vue 更配哦

    EventHub 是一个非常重要且常用的东西,在不相关组件通信方面有着很强大的作用。 EventHub 想想如果从...

  • 组件通信eventHub和Redux

    首先我们要实现上面的结构,根组件App下面有两个子组件大爸和二爸,他们分别都有两个子组件,然后我们要在全局声明一个...

  • EventHub-任意组件通信

    什么是EventHub EventHub本质上是基于发布订阅模式来实现的,可以将EventHub理解为发布订阅模式...

  • react组件通信

    需要组件通信的几种情况:1.父组件向子组件通信2.子组件向父组件通信3.跨级组件通信4.没有嵌套关系组件之间的通信...

  • Vue组件化常用技术

    组件传值、通信 父组件=>子组件 1.属性props 2.引用refs 3.子组件children 4.子组件 =...

  • 0.Vue知识学习整理-1_2020-03-17

    一.Vue开发知识体系: 二.Vue知识整理:4.组件通信 Vue.component('组件name',{......

  • vue中的组件通信

    一、组件通信(组件传值) 1.1父子组件通信 1.2子父组件通信 1.3非父子组件通信(兄弟组件通信)

  • 组件通信

    组件通信分为几种: 父组件给子组件通信 子组件给父组件通信 兄弟组件通信 1.父组件给子组件通信 法一...

网友评论

      本文标题:4.组件通信-eventHub

      本文链接:https://www.haomeiwen.com/subject/rgdtyqtx.html