react(尚硅谷)02-props基本写法,给props设置数据规则,函数式组件使用props,字符串形式的refs,回调形式的的ref,createRef的使用

1、props基本写法

和vue里面的props很像,这里直接从组件的标签属性中往组件属性中传值,建立起了组件和外部的通讯。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //1、创建组件
    class Person extends React.Component{
      render(){
        const {name,age,gender}=this.props

        return (
          <ul>
            <li>姓名:{name}</li>
            <li>年龄:{age}</li>
            <li>性别:{gender}</li>
          </ul>)
      }

    }

    //2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
    ReactDOM.render(<Person name="zhangsanfeng" age='34' gender='female'/>,document.getElementById('test'))


  </script>
</body>
</html>

2、给props设置数据规则

使用propTypes来设定
具体规则是react内置的规则:React.PropType.string等等(16的版本以后被弃用)16版本以前放在prop-types.js里,需要引包
对应必填的可以使用链式语法
对于默认值使用类.defaultProps={}的形式来写
prop是只读的,不可以写

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //1、创建组件
    class Person extends React.Component{
      render(){
        const {name,age,gender}=this.props

        return (
          <ul>
            <li>姓名:{name}</li>
            <li>年龄:{age}</li>
            <li>性别:{gender}</li>
          </ul>)
      }

    }
    Person.propTypes={
      name:PropTypes.string.isRequired,//指定姓名为字符串且必须
      gender:PropTypes.string,
      age:PropTypes.number,
      speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
    }
    Person.defaultProps={
      gender:'gonggong',
      age:18
    }
    const p={name:'zhangsan',age:34,gender:'female'}

    //2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
    //这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
    ReactDOM.render(<Person  {...p}/>,document.getElementById('test'))


  </script>
</body>
</html>

实际propType和defaultProps都可以以静态属性的形式写在类内部。这样避免了在类外部定义属性。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //1、创建组件
    class Person extends React.Component{
      static propTypes={
        name:PropTypes.string.isRequired,//指定姓名为字符串且必须
        gender:PropTypes.string,
        age:PropTypes.number,
        speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
      }
      static defaultProps={
        gender:'gonggong',
        age:18
      }
      render(){
        const {name,age,gender}=this.props

        return (
          <ul>
            <li>姓名:{name}</li>
            <li>年龄:{age}</li>
            <li>性别:{gender}</li>
          </ul>)
      }

    }
    const p={name:'zhangsan',age:34,gender:'female'}

    //2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
    //这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
    ReactDOM.render(<Person  {...p}/>,document.getElementById('test'))


  </script>
</body>
</html>

3、函数式组件使用props

直接对函数的形参传入props就行

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //1、创建组件
    class Person extends React.Component{
      constructor (props) {
        super(props);
      }
      static propTypes={
        name:PropTypes.string.isRequired,//指定姓名为字符串且必须
        gender:PropTypes.string,
        age:PropTypes.number,
        speak:PropTypes.func//func是函数的意思,这里不用function是因为它是关键字,另外,speak我没在虚拟dom里面传属性
      }
      static defaultProps={
        gender:'gonggong',
        age:18
      }
      render(){
        const {name,age,gender}=this.props

        return (
          <ul>
            <li>姓名:{name}</li>
            <li>年龄:{age}</li>
            <li>性别:{gender}</li>
          </ul>)
      }

    }
    //函数式组件接收props
    function NewPerson(props){
      const {name,age,gender}=props
      return (
        <ul>
          <li>name:{name}</li>
          <li>age:{age}</li>
          <li>gender:{gender}</li>
        </ul>
      )
    }
    NewPerson.prototypes={
      name:PropTypes.string.isRequired,//指定姓名为字符串且必须
      gender:PropTypes.string,
      age:PropTypes.number
    }

    NewPerson.defaultProps={
      gender:'gonggong',
      age:18
    }
    //2、渲染虚拟dom到页面,render三个参数,1,虚拟dom,2,渲染到的容器,3、回调函数
    //这里使用扩展运算符展开了p对象,注意,这个三点展开不是js的原生运算,是react特有的
    ReactDOM.render(<Person  name="zhangsan"/>,document.getElementById('test'))
    ReactDOM.render(<NewPerson  name="lisi" gender="male"/>,document.getElementById('test'))


  </script>
</body>
</html>

4、字符串形式的ref(不被推荐)

组件内的标签可以定义ref属性来标识自己
ref值{key:value}对应组件标签中的键值对,其中key对应组件标签ref的值,value对应当前节点

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
    class MyComponent extends React.Component{
      //使用赋值及箭头函数的形式来避免this指向错误
      showleft=()=>{
        const {inputLeft}=this.refs
        console.log(inputLeft.value)
      }
      showright=()=>{
        const {inputRight}=this.refs
        console.log(inputRight.value)
      }
      render(){
        return (
          <div>
            <input type="text" ref="inputLeft"  placeholder="please input something"/>
            <input type="button" onClick={this.showleft} value="弹出"/>
            <input type="text" ref="inputRight" onBlur={this.showright}  placeholder="please input somthing"/>
          </div>
        )
      }
    }

    //渲染组件
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))


  </script>
</body>
</html>

5、回调形式的ref

ref={回调函数}//注意是回调函数,不是回调函数名
这个箭头函数的参数就是当前节点
在函数体内对ref的值进行命名
这个回调函数由react来调用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
    class MyComponent extends React.Component{
      //使用赋值及箭头函数的形式来避免this指向错误
      showleft=()=>{
        const {inputLeft}=this
        console.log(inputLeft.value)
      }
      showright=()=>{
        const {inputRight}=this
        console.log(inputRight.value)
      }
      render(){
        //ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
        return (
          <div>
            <input type="text" ref={(currentNode)=>{this.inputLeft=currentNode}} placeholder="please input something"/>
            <input type="button" onClick={this.showleft} value="弹出"/>
            <input type="text" ref={(currentNode)=>{this.inputRight=currentNode}} onBlur={this.showright}  placeholder="please input somthing"/>
          </div>
        )
      }
    }

    //渲染组件
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))


  </script>
</body>
</html>

  • //ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
  • //注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
  • 要避免这么使用的话则使用类调用的形式
  • jax注释使用{/**/}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
    class MyComponent extends React.Component{
      state={ishot:true,wind: '微风'}
      //使用赋值及箭头函数的形式来避免this指向错误
      showleft=()=>{
        const {inputLeft}=this
        console.log(inputLeft.value)

      }
      showright=()=>{
        const {inputRight}=this
        console.log(inputRight.value)
      }
      changeWeather=()=>{
        const {ishot}=this.state
        //
        this.setState({ishot:!ishot})
      }

      saveinput=(currentNode)=>{
        this.inputLeft=currentNode
        console.log('@',currentNode)

    }
      render(){
        //ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
        //注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
        //建议写成内联的
        const {ishot}=this.state

        return (
          <div>
            <h1>今天天气很{ishot?'炎热':'凉爽'}</h1>
            <button onClick={this.changeWeather}>点我切换天气</button>
            {/*<input type="text" ref={(currentNode)=>{this.inputLeft=currentNode;
              console.log('@',currentNode)}} placeholder="please input something"/>*/}
            <input ref={this.saveinput} type="text"/>
            <input type="button" onClick={this.showleft} value="弹出"/>
            <input type="text" ref={(currentNode)=>{this.inputRight=currentNode}} onBlur={this.showright}  placeholder="please input somthing"/>
          </div>
        )
      }
    }

    //渲染组件
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))


  </script>
</body>
</html>

6、creatRef的使用
  • React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点
  • 该容器专人专用,只能使用一份,所以需要创建另外一个容器
  • 目前这种形式是最被推荐的
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="test">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
    class MyComponent extends React.Component{
      myRef=React.createRef()
      myRef2=React.createRef()
      state={ishot:true,wind: '微风'}
      //使用赋值及箭头函数的形式来避免this指向错误
      showleft=()=>{
        // const {inputLeft}=this
        // console.log(inputLeft.value)
        console.log(this.myRef.current.value)

      }
      showright=()=>{
        // const {inputRight}=this
        // console.log(inputRight.value)
        console.log(this.myRef2.current.value)

      }
      changeWeather=()=>{
        const {ishot}=this.state
        //
        this.setState({ishot:!ishot})
      }

      saveinput=(currentNode)=>{
        this.inputLeft=currentNode
        console.log('@',currentNode)

    }
      render(){
        //ref=后面以对象的形式传入一个回调函数,回调函数的参数是当前节点,将当前节点赋值给this,并给ref取名为inputLeft
        //注意:在内联调用下,回调会执行两次,一次是传null,第二次才传入当前节点
        //建议写成内联的
        const {ishot}=this.state

        return (
          <div>
            <h1>今天天气很{ishot?'炎热':'凉爽'}</h1>
            <button onClick={this.changeWeather}>点我切换天气</button><br/>
            {/*<input type="text" ref={(currentNode)=>{this.inputLeft=currentNode;
              console.log('@',currentNode)}} placeholder="please input something"/>*/}
            <input ref={this.myRef} type="text"/>
            <input type="button" onClick={this.showleft} value="弹出"/><br/>
            <input type="text" ref={this.myRef2} onBlur={this.showright}  placeholder="please input somthing"/>
          </div>
        )
      }
    }

    //渲染组件
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))


  </script>
</body>
</html>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值