组件传值

组件传值可以分成三类

1.父组件向子组件传递数据

2.子组件向父组件传递数据

3.非父子组件之间的数据传递


父传子

函数式组件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8" />
            <title>Hello World</title>
            <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
            <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
            <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        </head>
        <body>
            <div id="root"></div>
        </body>

    </html>
    <!--

        组件:组成的部件,可以接受任何props输入,并返回元素

    -->
    <script type="text/babel">

        // 创建一个父组件 
        function Parent(){
            return (
                <div>
                    <h1>这是父组件</h1>
                    {/*在父组件中嵌套子组件*/}
                    <Child name="1"></Child>
                </div>
            )
        }

        // 创建一个子组件 列表
        function Child(props){
            return (
                <div>
                    <h3>这是子组件</h3>
                    <ul>
                        <li>{props.name}</li>
                        <li>2</li>
                        <li>3</li>
                    </ul>
                </div>
            )
        }

        // 2. 组件的使用
        ReactDOM.render(
            <Parent></Parent>, 
            document.getElementById('root') 
        );

    </script>

类组件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8" />
            <title>Hello World</title>
            <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
            <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
            <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
        </head>

        <body>
            <div id="root"></div>
        </body>

    </html>
    <script type="text/babel">

        // 创建一个类组件  -- 父
        class Parent extends React.Component{
            render(){
                return (
                    <div>
                        <h1>这是父组件</h1>
                        {/*在父组件中嵌套子组件*/}
                        <Child name="1"></Child>
                    </div>
                )
            }
        }


        // 创建一个类组件  -- 子
        class Child extends React.Component{
            render(){
                return (
                    <div>
                        <h3>这是子组件</h3>
                        <ul>
                            <li>{this.props.name}</li>
                            <li>2</li>
                            <li>3</li>
                        </ul>
                    </div>
                )
            }
        }



        ReactDOM.render(
            <Parent></Parent>, 
            document.getElementById('root') 
        );

    </script>

子传父

函数式组件

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">

    //子组件
    function Child(props){
            return (
                <div>
                    {/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
                        子组件:<input onChange={props.handleEmail}/>
                </div>
           )
    }

    //父组件
    function Parent() {

        return (
            <div>
                <div id='div'>父组件:{1}</div>
                <Child name="email" handleEmail={
                    function (event){
                        /*获取子组件的数据*/
                        console.log(event.target.value)

                        document.getElementById('div') = event.target.value

                    }
                }/>
            </div>
        )
    }

    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );

</script>

类组件

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <!--react的核心库-->
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">

    //子组件
    class Child extends React.Component{

        render(){
            return (
                <div>
                    {/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
                        子组件:<input onChange={this.props.handleEmail}/>
                </div>
            )
        }
    }

    //父组件
    class Parent extends React.Component{

        constructor(props){
            super(props)
            this.state = {
                email:''
            }
        }
        handleEmail(event){
            this.setState({email: event.target.value});
        }



        render(){
            return (
                <div>
                    <div>父组件:{this.state.email}</div>
                    <Child name="email" handleEmail={this.handleEmail.bind(this)}/>
                </div>
            )
        }
    }

    ReactDOM.render(
      <Parent />,
      document.getElementById('root')
    );

</script>

非父子

非父子组件传值之兄弟传值

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">


    class Brother1 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      render(){
        return (
          <div>
            <button onClick={this.props.refresh}>
                更新兄弟组件
            </button>
          </div>
        )
      }
    }

    class Brother2 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      render(){
        return (
          <div>
             {this.props.text || "兄弟组件未更新"}
          </div>
        )
      }
    }

    class Parent extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      refresh(){
        return (e)=>{
          this.setState({
            text: "兄弟组件沟通成功",
          })
        }
      }

      render(){
        return (
          <div>
            <h2>兄弟组件沟通</h2>
            <Brother1 refresh={this.refresh()}/>
            <Brother2 text={this.state.text}/>
          </div>
        )
      }
    }

    ReactDOM.render(<Parent />, document.getElementById('root'));

</script>

使用jquery自定义事件完成传值

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://code.jquery.com/jquery.js"></script>
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>
    </body>

</html>
<script type="text/babel">


    class Com1 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      render(){
        return (
            <div>
                <ul>
                    <li>1</li>
                </ul>
            </div>
        )
      }

      componentDidMount(){
              $('#root').on('bus',function(e,a,b){
                console.log(a,b)
            })
      }
    }

    class Com2 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      render(){
        return (
              <div>
                <ul>
                    <li>1</li>
                </ul>
            </div>
        )
      }

      componentDidMount(){
          $('#root').trigger('bus',[11,22])
      }
    }



    ReactDOM.render(
        <div>
            <Com1></Com1>
            <Com2></Com2>
        </div>,
        document.getElementById('root'));

</script>

使用原生js的方式实现组件之间的数据传递(注:只关注是否实现,不考虑兼容性问题)

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://code.jquery.com/jquery.js"></script>
        <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>

    <body>
        <div id="root"></div>

    </body>

</html>
<script type="text/babel">

    // 给dom元素绑定事件 ---- 作为中间人
    var elem = document.getElementById('root')
    var events = new Event('build');

    class Com1 extends React.Component{
      constructor(props){
        super(props);
        this.state = {}
      }

      render(){
        return (
            <div>
                <ul>
                    <li>1</li>
                </ul>
            </div>
        )
      }

      componentDidMount(){
          // 给dom元素添加事件监听, 通过函数参数完成数据的接收
          elem.addEventListener('build', function (event) {
            console.log(event.name)
        }, false);

      }
    }

    class Com2 extends React.Component{
      constructor(props){
        super(props);
        this.state = {
            name:'我是小高'
        }
      }

      render(){
        return (
              <div>
                <ul>
                    <li>1</li>
                </ul>
            </div>
        )
      }

      componentDidMount(){
          events.name = this.state.name
          elem.dispatchEvent(events)
      }
    }



    ReactDOM.render(
        <div>
            <Com1></Com1>
            <Com2></Com2>
        </div>,
        document.getElementById('root'));

</script>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值