学习react基础(3)_setState、state、jsx、使用ref的几种形式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

学习react


一、this.setState和this.state的区别?

常常将this.setState称为状态机,因为它在控制着我们类组件的状态,并且可以更改状态,改完之后还可以是页面中的数据也发生变化。而使用this.state对属性赋值只会改变数据并不会改变页面中展示的数据。
所以我们想通过改变数据从而改变页面的时候我们需要使用状态机来改变。

二、react核心

1.核心库

想使用react这个框架,我们并非需要使用脚手架来搭建,我们可以在html中引入它的两个核心库就可以将页面展示出来。
  • react
  • react-dom
  • babel
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script src="https://cdn.bootcdn.net/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.0.0-beta.3/babel.min.js"></script>
  </head>
  <body>
    <div id="zjq"></div>
  </body>
  <script type="text/babel">
        class  Zjq extends React.Component{
            render(){
                return (
                    <div>
                        zjq
                    </div>
                )
            }
        }
    ReactDOM.render(<Zjq/>, document.getElementById("zjq"));
  </script>
</html>

在这里插入图片描述
使用react-dom库中的render方法将Zjq组件渲染到了id为zjq的dom元素上。
利用babel转换jsx至js,上面只是类组件的形式,类组件需要继承来自React.Component这个类,并给实例添加render方法,返回值就是要渲染的dom标签。

2.jsx

javascript xml
jsx:

  1. 虽然是在js中书写标签,但是我们不用给标签加引号,jsx能自动识别为标签。
  2. 标签中的表达式、变量都需要在{}中书写:{this.state.xxx}
  3. 内联样式需要 style={{height:“100px”}},相当于在{}中插入一个style对象
  4. 只能有一个跟标签
  5. 标签必须要闭合
  6. 标签首字符小写会转成html中同名元素
  7. 大写会自动查找自定义组件 没有的话直接报错

3.class和function组件

在类组件中有状态和生命周期而function中没有,不过16.8版本中添加了hook。

react找到组件,判断calss组件还是function组件,class实例化组件调用自身render方法,function组件直接调用。
class组件中有this指向当前类实例,function中没有this
class中获取外界传来的props直接this.props
function中中获取外界传来的props直接使用函数第一个参数即可

4.事件

react重新对js原生的事件进行了封装,onclick---->onClick,onchange—>onChange等等,全部on开头的事件后面第一个字母都需要大写。

<script type="text/babel">
        class  Zjq extends React.Component{
            clickFun=()=>{
                console.log("object")
            }
            render(){
                return (
                    <div onClick={this.clickFun}>
                        zjq
                    </div>
                )
            }
        }
    ReactDOM.render(<Zjq/>, document.getElementById("zjq"));
  </script>

需要给类自身加属性我们使用static
props是只读的,不能修改

5.ref

  • 字符串形式:
<script type="text/babel">
        class  Zjq extends React.Component{
            clickFun=()=>{
                console.log(this.refs.zjqRef)
            }
            render(){
                return (
                    <div onClick={this.clickFun} ref="zjqRef">
                        zjq
                    </div>
                )
            }
        }
    ReactDOM.render(<Zjq/>, document.getElementById("zjq"));
  </script>
  • 回调函数形式
 <script type="text/babel">
        class  Zjq extends React.Component{
            myref =""
            clickFun=()=>{
                console.log(this.myref)
            }
            render(){
                return (
                    <div onClick={this.clickFun} ref={(ref)=>{this.myref = ref}}>
                        zjq
                    </div>
                )
            }
        }
    ReactDOM.render(<Zjq/>, document.getElementById("zjq"));
  </script>
  • createRef
<script type="text/babel">
        class  Zjq extends React.Component{
            myref =React.createRef()
            clickFun=()=>{
                console.log(this.myref.current)
            }
            render(){
                return (
                    <div onClick={this.clickFun} ref={this.myref}>
                        zjq
                    </div>
                )
            }
        }
    ReactDOM.render(<Zjq/>, document.getElementById("zjq"));
  </script>

总结

知其然知其所以然

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值