• 21.react 组件通信


    状态属性可以修改

    this.setState()中可以写对象,也可以写方法

    <script type="text/babel">
    
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                n:1
            }
        }
        fn(){
            /*this.setState({
                n:this.state.n+1
            });*/
    
            /*this.setState(function(prevState,props){
                console.log(prevState,props);
                return {
                    n:prevState.n + 1
                }
            });*/
            this.setState((prevState,props)=>({n:prevState.n + 1}));
        }
    
        render(){
            return <div>
                <span>{this.state.n}</span>
                <input onClick={this.fn.bind(this)} type="button" value="按钮" />
    
            </div>
        }
    }
    ReactDOM.render(
        <Test name="abc"/>,
        document.getElementById("app")
    
    );
    </script>
    

    res:
    image

    事件:

    获取点击坐标

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
        }
    
        fn(ev){
            console.log(1,ev);
            console.log(2,ev.clientX,ev.clientY);
        }
    
        render(){
            return <div>
                <input onClick={this.fn.bind(this)} type="button" value="按钮" />
    
            </div>
        }
    }
    
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    事件冒泡:

    没有ev.cancelBubble
    用ev.stopPropagation();

    <script type="text/babel">
    
    class Test extends React.Component{
        constructor(...args){
            super(...args);
        }
        div(ev){
            alert("div");
        }
        btn(ev){
            //ev.cancelBubble = true;//X 没有这个属性
            //console.log( ev.cancelBubble );
            ev.stopPropagation();//√
            alert("btn");
        }
    
        render(){
            return <div onClick={this.div.bind(this)}>
                <input onClick={this.btn.bind(this)} type="button" value="按钮" />
    
            </div>
        }
    }
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    默认事件:

    return false;//无效
    用ev.preventDefault();

    <script type="text/babel">
        class Test extends React.Component{
            constructor(...args){
                super(...args);
            }
            fn(ev){
                ev.preventDefault();
                //return false;
            }
        
            render(){
                return <div>
                    <a onClick={this.fn.bind(this)} href="http://www.baidu.com/">百度</a>
                </div>
            }
        }
        
        ReactDOM.render(
            <Test/>,
            document.getElementById("app")
        );
    </script>
    

    留言板:

    留言板添加删除

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state={
                msg:"",
                arr:["aaa","bbb","ccc"],
            }
        }
        show(ev){
            this.setState({
                msg:ev.target.value,
            })
        }
        add(){
            this.state.arr.unshift(this.state.msg);
            this.setState({
                arr:this.state.arr
            })
        }
        del(index){
            this.state.arr.splice(index,1);
            this.setState({
                arr:this.state.arr
            })
        }
    
        render(){
            let arr = this.state.arr;
            /*let aULi = [];
            for(let i = 0; i < arr.length; i++){
                aULi.push(<li key={i}>{arr[i]}</li>);
            }*/
            let aUli = arr.map((item,index)=><li key={index}>{item}<a onClick={this.del.bind(this,index)} href="javascript:;">删除</a></li>);
            return <div>
                <input type="text" onInput={this.show.bind(this)}/>
                <input type="button" onClick ={this.add.bind(this)} value="添加"/>
                <ul>
                    {aUli}
                </ul>
                
            </div>
        }
    }
    ReactDOM.render(
        <Test/>,
        document.getElementById("app"),
    )
    </script>
    

    res:
    image
    image

    数据绑定:

    input数据绑定,加value属性时需要加onChange事件
    this.setState({
    msg:ev.target.value
    });

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                msg:"",
            }
        }
    
        fn(ev){
            this.setState({
                msg:ev.target.value
            });
        }
            
        render(){
            return <div>
                <input type="text" onInput={this.fn.bind(this)} /> <br />
                
                <input type="text" value={this.state.msg} onChange={this.fn.bind(this)} /> <br />
                {this.state.msg}
            </div>
        }
    }
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    求和:

    exp1:

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                a:1,b:1
            }
        }
    
        keyupHandle1(ev){
            this.setState({
                a:parseInt(ev.target.value),
            });
        }
        keyupHandle2(ev){
            this.setState({
                b:parseInt(ev.target.value),
            });
        }
        sumHandle(){
    
        }
     
        render(){
            return <div>
                    <input type="text" onKeyUp={this.keyupHandle1.bind(this)} /> 
                    <input type="text" onKeyUp={this.keyupHandle2.bind(this)} /> 
                    <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
                    {this.state.a + this.state.b}
            </div>
        }
    }
    
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    exp2:

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                a:1,b:1
            }
        }
        sumHandle(){
            let oText1 = document.getElementById("txt1");
            let oText2 = document.getElementById("txt2");
            this.setState({
                a:parseInt(oText1.value),
                b:parseInt(oText2.value)
            });
        }
     
        render(){
            return <div>
                    <input id="txt1" type="text"  /> 
                    <input id="txt2" type="text"   /> 
                    <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
                    {this.state.a + this.state.b}
            </div>
        }
    }
    
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    exp3:

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                a:1,b:1
            }
        }
        sumHandle(){
    
            console.log(this.refs);
            
            this.setState({
                a:parseInt(this.refs.txt1.value),
                b:parseInt(this.refs.txt2.value)
            });
        }
     
        render(){
            return <div>
                    <input ref="txt1" type="text"  /> 
                    <input ref="txt2" type="text"   /> 
                    <input onClick={this.sumHandle.bind(this)} type="button" value="=" />
                    {this.state.a + this.state.b}
            </div>
        }
    }
    
    ReactDOM.render(
       <div>
            <Test/>
            <Test/>
       </div>,
        document.getElementById("app")
    );
    </script>
    

    image

    exp3:

    <script type="text/babel">
    class Test extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                a:1,b:1
            }
        }
    
        keyupHandle1(ev){
            this.setState({
                a:parseInt(ev.target.value),
            });
        }
        keyupHandle2(ev){
            this.setState({
                b:parseInt(ev.target.value),
            });
        }
        render(){
            return <div>
                    <input type="text" value={this.state.a} onChange={this.keyupHandle1.bind(this)} /> 
                    <input type="text" value={this.state.b} onChange={this.keyupHandle2.bind(this)} /> 
                    <input  type="button" value="=" />
                    {this.state.a + this.state.b}
            </div>
        }
    }
    
    ReactDOM.render(
        <Test/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    组件通信:

    父子:

    父--->子

    传递数据:props refs

    子--->父

    1、需要先把父级传递给子级
    2、this.props.parent.xxx

    非父子 :需要借助全局变量 缺点:乱!不易管理!

    exp1:父--->子
    <script type="text/babel">
    class Parent extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                name:"你好呀!"
            }
        } 
        render(){
            return <div> 父组件 ----{this.state.name}
                <Child name={this.state.name}/>
            </div>
        }
    }
    
    class Child extends React.Component{
        constructor(...args){
            super(...args);
        } 
        render(){
            return <div>子组件----{this.props.name}</div>
        }
    }
    ReactDOM.render(
        <Parent/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    exp2: 子--->父

    parent={this}把整个父元素传过去

    <script type="text/babel">
    class Parent extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                name:"你好呀!"
            }
        }
        fn(data){
            alert("父级");
            this.setState({
                name:data
            })
        }
        render(){
            return <div> 父组件 ----{this.state.name}
                <Child name={this.state.name} parent={this} />
            </div>
        }
    }
    
    class Child extends React.Component{
        constructor(...args){
            super(...args);
        } 
        fn(){
            this.props.parent.fn(666);
    
        }
    
        render(){
            return <div onClick={this.fn.bind(this)}>子组件----{this.props.name}</div>
        }
    }
    ReactDOM.render(
        <Parent/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image
    image
    image

    exp3:父子通信显示删除
    <script type="text/babel">
    
    let arr = [
        {id:Math.random(),username:"aaa",password:"123"},
        {id:Math.random(),username:"bbb",password:"123"},
        {id:Math.random(),username:"ccc",password:"123"}
    ];
    //父,列表
    class UserList extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                users:this.props.users
            }
        }  
        delHandle(id){
            //alert("删除"+id);
    
            this.setState({
                users:this.state.users.filter(item => id != item.id)
            });
        }
    
        render(){
    
            let aUser = this.state.users.map((item,index)=><User key={item.id} parent={this} user={item}/>);
    
            return <ul>
                {aUser}
            </ul>
        }
    }
    //子,元素
    class User extends React.Component{
        constructor(...args){
            super(...args);
        }  
        fn(id){
            this.props.parent.delHandle(id);
        }
        render(){
            return <li>{this.props.user.username}-----{this.props.user.password} 
    
                <a onClick={this.fn.bind(this,this.props.user.id)} href="javascript:;">删除</a>
    
            </li>
        }
    }
    
    ReactDOM.render(
        <UserList users={arr}/>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image

    image

    exp4:兄弟通信

    点击组件2修改组件1,设置全局变量,

    <script type="text/babel">
    //全局变量
    let a = null;
    class Comp1 extends React.Component{
        constructor(...args){
            super(...args);
            this.state = {
                msg:"aaaa"
            }
    
            a=(data)=>{
                //alert(1);
                this.setState({
                    msg:data
                });
            }
        }
        render(){
            return <div>组件1-----{this.state.msg}</div>
        }
    }
    
    class Comp2 extends React.Component{
        constructor(...args){
            super(...args);
        }
        fn(){
            a("bbb");
        }
        render(){
            return <div onClick={this.fn.bind(this)}>组件2</div>
        }
    }
    
    ReactDOM.render(
        <div>
            <Comp1/>
            <Comp2/>
        </div>,
        document.getElementById("app")
    );
    </script>
    

    res:
    image
    image

  • 相关阅读:
    JS防Yahoo的选项卡导航特效
    纯CSS制作简洁带提示的导航
    绿色简单的CSS下拉菜单
    JS+CSS防FLASH效果竖向可折叠的滑动菜单
    鼠标划过快速展开的JS下拉菜单
    ASP.NET页面生命周期(转载)
    JS Eval函数作用(转载)
    Html十个不常用的标签(转载)
    CSS定位学习
    FireBug调试器相关(转载)
  • 原文地址:https://www.cnblogs.com/zhongchao666/p/9463043.html
Copyright © 2020-2023  润新知