传值与状态机

props

1. Props传入参数

  1. props 是组件对外的接口。使用props就可以向组件内部进行数据传递
  2. 注意:Props对于使用它的组件来说,是只读的。一旦赋值不能修改。也就是说props的值是不可变的只能在渲染的时候传入无法动态赋值。
  3. 当一个组件被注入Props 值时,属性值来源于它的父级元素,从父级到子元素。
<script src="js/react.16.8.6.js"></script>
<script src="js/react-dom.16.8.6.js"></script>
<script src="js/babel.min.js"></script>
<script src="js/prop-types.js"></script>

<div id="demodiv"></div>

<script type="text/babel">
    function Zi(props){
        return (
            <h1>我是子组件{props.text}++++++++++++{props.name}</h1>
        )
    }

    function Fu(){
        return (
            <div>
                <p>我是父组件</p>    
                <Zi text="我是调用的数据" name="我是传入的数据"/>
            </div>
        )
    }

    ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>

1.1Props传入参数扩展

在参数较多的时候可以把Object类型进行传递

<script type="text/babel">
//为什么要传递进来一个对象,解决子组件中传递多个props的时候传递参数不方便

    var obj={
        name:"mgd",
        age:16,
        sex:"男",
        phone:18409441016
    }

    function Fu(props){
        return (
            <div>
                <p>我是父组件</p>   
                <h1>{props.name}</h1>
                <h1>{props.age}</h1>
                <h1>{props.sex}</h1>
                <h1>{props.phone}</h1> 
            </div>
        )
    }

    ReactDOM.render(<Fu {...obj}/>,document.getElementById("demodiv"))
</script>

1.2Props默认值

1.用==||==来进行判断

<script type="text/babel">
    function Zi(props){
        props.text=props.text||"我是子组件的默认值"
        return (
            <h1>我是子组件{props.text}</h1>
        )
    }

    function Fu(){
        var futext="我是父组件的数据5555555"
        return (
            <div>
                <p>我是父组件</p>    
                <Zi text={futext}/>
            </div>
        )
    }

    ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>

2.defaultProps
有些时候, 我们需要设置一些默认属性, 在父级组件未向子级组件传递数据时, 填充默认值。defaultProps

<script type="text/babel">
    function Zi(props){
        return (
            <h1>我是子组件{props.text}++++{props.num}</h1>
        )
    }

    function Fu(){
        var futext="我是父组件的数据5555555"
        return (
            <div>
                <p>我是父组件</p>    
                <Zi text="王大锤"/>
            </div>
        )
    }

    //给需要默认值的组件进行默认props的设置
    Zi.defaultProps={
        text:"么么哒",
        num:"木马"
    }

    ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>

2. Props验证

15.5之前Props验证使用propTypes,它可以保证我们在应用组件的时候可以正确的传递值
注意:自React15.5起,React.PropType已经移入另一个包中,请使用prop-type代替

<script src="js/react.16.8.6.js"></script>   <!-- 注意此处引入的包是15.5之后的 -->
<script src="js/react-dom.16.8.6.js"></script>      <!-- 注意此处引入的包是15.5之后的 -->
<script src="js/babel.min.js"></script>
<script src="js/prop-types.js"></script>
<script type="text/babel">
     function Zi(props){
        return (
            <h1>我是子组件{props.name}</h1>
        )
    }

    // var num=1;//会报错

    function Fu(){
        return (
            <div>
                <p>我是父组件</p>    
                <Zi name="你好,么么哒"/>
               { /* <Zi name={num}/> */}
            </div>
        )
    }
    Zi.propTypes={
        name:PropTypes.string.isRequired
    }
    ReactDOM.render(<Fu/>,document.getElementById("demodiv"))
</script>

3.class类定义方式:传入参数

3.1 传入参数

使用this.props.xx接收值

<script type="text/babel">
    class MyCom extends React.Component{
        render(){
            return (
                <div>
                    <p>我是组件{this.props.name}</p>    
                </div>
            )
        }
    }
    ReactDOM.render(<MyCom name="你好,么么哒"/>,document.getElementById("demodiv"))
</script>

3.2 设置默认属性

类方式创建使用defaultPropos进行默认值设置两种方式

<script type="text/babel">
    class MyCom extends React.Component{
        //方式2
        static defaultProps={
            name:"我是默认值"
        }
        render(){
            return (
                <div>
                    <p>我是组件{this.props.name}</p>    
                </div>
            )
        }
    }

    //方式1
    // 组件名.defaultProps+{
    //     nnn:"nnn"
    // }

    // MyCom.defaultProps={
    //     name:"我是默认值"
    // }

    ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>

4. 事件处理基础

4.1 事件处理

  1. React事件绑定属性的命名采用驼峰式写法
  2. 绑定函数的过程中不加() 否则函数会立即执行
<button onClick={this.fun}>点击</button>
<script type="text/babel"> 
    // function fun(){
    //     console.log("么么哒")
    // }
    class MyCom extends React.Component{
        constructor(props){
            super(props)
        }
        fun(){
            console.log("你好,么么哒")
        }
        render(){
            return (
                <div>
                   { /* 不能加圆括号,加圆括号函数自动触发 */}
                    <p onClick={this.fun}>我是父组件</p>    
                </div>
            )
        }
    }

    ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>

State 状态机

1. 状态机

  1. 在react中开发者只需要关心数据。数据改变页面就会发生改变
  2. 数据等同于状态。状态改变-页面绑定的数据就由react进行改变
  3. 组件被称之为“状态机”,通过更新组件的state来更新对应页面的显示(从新渲染组件 不需要要操作 DOM)

2. 使用

2.1初始化状态

使用状态必须先初始化:this.state={}

class MyCom extends React.Component{
        //1.先创建状态
        constructor(props){
            //默认是没有this的,要从父中八this拿过来
            super(props)
            //使用this.state来进行初始化
            this.state={
                name:"小明"
            }
        }
    }

2.2读取状态

读取状态:this.state.key1

render(){
    return (
        <div>
            <h1>{this.state.name}</h1>    
        </div>
    )
}

2.3更新状态

更新状态—》组件界面更新:this.setState({})

 fun=()=>{
    //注意单词
    this.setState({
        name:"大黄"
    })
}

完整使用

<script type="text/babel">
    // 在这里注意,一定要清楚:
    // 如果一个组件有状态,不能使用函数组件的方式
    class MyCom extends React.Component{
        //1.先创建状态
        constructor(props){
            //默认是没有this的,要从父中八this拿过来
            super(props)
            //使用this.state来进行初始化
            this.state={
                name:"小明"
            }
        }

        //在这里需要注意的是函数的this
        /* //修改this指向1
        fun=()=>{
            //注意单词
            this.setState({
                name:"大黄"
            })
        } */

        fun=()=>{
            //注意单词
            this.setState({
                name:"大黄"
            })
        }

        render(){
            return (
                <div>
                    <h1>{this.state.name}</h1>   
                   { /* 修改this指向2:在调用的时候传入this */}
                    <button onClick={this.fun.bind(this)}>点我修改数据</button>
                </div>
            )
        }
    }
    ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))
</script>

扩展知识

  1. 为什么不用工厂方式创建组件
    在有状态的前提下 不能使用工厂方式创建组件
  2. 修改this指向
    • 通过bind方法进行原地绑定,从而改变this指向
    • 通过创建箭头函数
    • 在constructor中提前对事件进行绑定
    • 将事件调用的写法改为箭头函数的形式

练手demo:

  1. 同步修改输入框输入内容值改变
<script type="text/babel">

//1.创建组件
    class MyCom extends React.Component{

        constructor(props){
            super(props)
            //2.创建状态数据
            this.state={
                inputval:'22222'
            }
        }

        //5.创建函数
        //7.设置event对象
        fun=(e)=>{
            //6.修改state的数据
            this.setState({
                // inputval:?????数据怎么来,详见第七步
                inputval:e.target.value
            })
        }

        render(){
            return (
                <div>
                    {/* 4.绑定事件,当用户输入的时候,触发修改操作 */}
                    {/* 8.把输入框也绑定上state的数据 */}
                    <input type="text" onInput={this.fun} value={this.state.inputval}/> 
                    {/* 展示state的数据 */}
                    <h1>输入框输入的数据是====={this.state.inputval}</h1>
                </div>
            )
        }
    }

    ReactDOM.render(<MyCom/>,document.getElementById("demodiv"))

</script>

在这里插入图片描述

  1. 当点击页面内容–文字进行改变
<script type="text/babel">
    class My extends React.Component{
        constructor(props){
            super(props)
            this.state={
                text:"我是默认的"
            }
        }

        fun(){
            this.setState({
                text:'你好,么么哒'
            })
        }

        render(){
            return(
                <div>
                    <h1 onClick={this.fun.bind(this)}>点我</h1>  
                    <p>我是要变化的值====={this.state.text}</p>
                </div>
            )
        }
    }

    ReactDOM.render(<My/>,document.getElementById("demodiv"))
</script>

在这里插入图片描述

  1. 点击按钮添加页面内容
<script type="text/babel">

    class My extends React.Component{
        constructor(props){
            super(props)

            this.state={
                inputval:"",
                text:''
            }
        }

        fun=(e)=>{
            this.setState({
                inputval:e.target.value
            })
        }

        func(){
            this.setState({
                text:this.state.inputval
            })
        }
        render(){
            return(
                <div>
                    <input type="text" onInput={this.fun}/>
                    <button onClick={this.func.bind(this)}>点我设置</button>
                    <p>输入框的内容是++++++{this.state.text}</p>    
                </div>
            )
        }
    }

    ReactDOM.render(<My/>,document.getElementById("demodiv"))
</script>

在这里插入图片描述

温馨提示:

本篇博客中的案例中挖了很多的坑,填平有进步喔

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值