首页 > 技术文章 > react中数据承载--props和state用法

cupid10 2020-09-01 19:48 原文

react中数据承载

react中数据承载的两种方式:

​ props: 自己可以设置默认属性,也可以从外部传入属性,但是外部传入的属性,自己只能用,不能用来修改

​ state: 一般由自己控制,自己可以进行状态的更改。

props

函数组件

函数式组件中:
通过参数props.xxx获取外部传入的属性值

<body>    
    <div id="app"></div>
    <script type="text/babel">           
        const App = function(props){
            return (
                <div>
                    我是app组件! --- { props.username }  --- { props.age+1 } --- {props.sex} --- {props.address}
                </div>
            )
        }
        let obj = {
            sex:"女"
        }
        let other = {
            address:"贫民窟"
        }
        ReactDOM.render(<App {...other} sex={obj.sex} username={"张三"}  age={10} />,document.getElementById("app"))
    </script>
</body>
类组件

类组件中:
通过this.props.xxx获取外部传入的属性值

<body>    
    <div id="app"></div>
    <script type="text/babel">      
        class App extends React.Component{
        render(){
          let {sex,username,age} = this.props;
                 return (
                     <div>
                        我是app组件! --- { username }  --- { age+1 } --- {sex} --- {this.props.address}
                    </div>
                )
            }
         }        
        let obj = {
            sex:"女"
        }
        let other = {
            address:"贫民窟"
        }
        ReactDOM.render(<App {...other} sex={obj.sex} username={"张三"}  age={10} />,document.getElementById("app"))
    </script>
</body>

state

类组件

状态一般放在constructor进行定义,在构造函数中进行初始化

<body>
    
    <div id="app"></div>
    <script type="text/babel">

        //举例 计数器案例
        let a = 1
        class Counter extends React.Component{
            //状态一般放在constructor进行定义的
            constructor(){
                super()
                this.state = {  //状态通常在构造函数中进行初始化
                    count:1
                }
            }

            handleClick = ()=>{
                // this.state.count = this.state.count+1
                // this.forceUpdate() 

                // react中推荐采用setState,就可以实现数据改变,视图更新操作了
                // setState方法是异步的,如果想要获取更新后的最新状态,需要写在第二个参数中
                // this.setState({
                //     count: this.state.count+1
                // },()=>{
                //     console.log(this.state.count)
                // })


                // 这种形式的 setState() 也是异步的,并且在同一周期内会对多个 setState 进行批处理,下方的函数执行了三次,但是结果仍是2
                // Object.assign() 
                /* this.setState({
                    count:this.state.count+1
                })
                this.setState({
                    count:this.state.count+1
                })
                this.setState({
                    count:this.state.count+1
                }) */


                // 如果后续状态取决于当前状态,我们建议使用 updater 函数的形式代替
                // 下方的代码会依次执行
                // this.setState((prevState)=>{
                //     return {
                //         count: prevState.count+1
                //     }
                // },()=>{
                //     console.log(this.state.count)
                // })
                // this.setState((prevState)=>{
                //     return {
                //         count: prevState.count+1
                //     }
                // })
                // this.setState((prevState)=>{
                //     return {
                //         count: prevState.count+1
                //     }
                // })

            }

            render(){
                return (
                    <div>
                        <p>{this.state.count}</p>    
                        <button onClick={this.handleClick}>更改counter</button>
                    </div>
                )
            }
        }


        class App extends React.Component{
            render(){
                return (
                    <div>
                        <Counter/>    
                    </div>
                )
            }
        }


        ReactDOM.render(<App/>,document.getElementById("app"))
    </script>
</body>

函数组件

在函数组件中,我们可以采用 React 16.8 useState 这个hooks来去同时定义一个状态和一个更改状态的方法

<body>
    
    <div id="app"></div>
    <script type="text/babel">
        const App = props=>{
            //定义了一个状态 count=1
            //定义了一个更改状态的方法 setCount
            const [count, setCount] = React.useState(1);
            const [title,setTitle] = React.useState("hello");
            return (
                <div>
                    App --- {count} -- {title}
                    <p><button onClick={()=>{setCount(count+1)}}>更改count</button></p>   
                    <p><button onClick={()=>{setTitle('你好')}}>更改title</button></p>   
                </div>
            )
        }
        ReactDOM.render(<App/>,document.getElementById("app"))
    </script>
</body>

推荐阅读