React(day1)

本文介绍了React中JSX的作用以及如何通过Babel转换,讲解了函数式组件和类式组件的创建及执行流程。同时,详细阐述了React组件的State和Props的使用,包括如何改变State、设置默认值以及类型约束。
摘要由CSDN通过智能技术生成

1、react推荐JSX写

由于JSX不能被浏览器直接识别,所以要引入babel,JSX是解决创建虚拟DOM繁琐。

  <script type="text/babel">
  <!----JSX创建虚拟DOM----->
    let VDOM=<h1>体验JSX</h1>
    <!----渲染虚拟DOM-->
    ReactDOM.render(VDOM,document.getElementById('test'))
  </script>

2、函数式组件

function MyComponent(){
	/*函数里边的this是undefind*/
	return <div>体验函数式组件</div>
	}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
    /*ReactDom.render(<MyComponent>)发生了react解析组件标签,找到了MyComponent组件,随后执行组件*/

3、类式组件

class MyComponent extends React.Component{
      render(){
        console.log(this,'MyComponent')
        /*
        类式组件必须继承React.Component,render必须有,
        render放在MyComponent的原型对象上给实例使用
        里面的this指向实例
        */
        return <div>类式组件</div>
      }
    }
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))
    /*
      ReactDom.render(<MyComponent>)发生了react解析组件标签,找到了MyComponent组件,
      发现组件是类定义的,随后new了该类的实例对象,调用该实例原型上的render方法
      虚拟DOM转化真实DOM,随后渲染页面
      */

4、 组件三个属性

1、 State(state 是React组件自身的数据,具有“响应式”的特性)

例:点击改变天气

1、更改class中方法this指向

class MyComponent extends React.Component{
  constructor(props){
    super(props)
    this.state={isHot:true}
    /*将原型上的changeWeather赋值给this,并且更改changeWeather中this指向,如果没有这句changeWeather中this是unddefind*/
    /*为啥changeWeathwer中this指向不对,因为react在挂在dom节点的时候帮我们new了实例对象,constructor和render都是通过实例对象调用,只有changeWeather不是,所以z指向不对,react类中的方法还开了严格模式*/
    this.changeWeather=this.changeWeather.bind(this)
    console.log(this)
  }
  render(){
    let {isHot}=this.state
    return <div onClick={this.changeWeather}>今天天气{isHot?'热':"冷"}</div>
  }
  /*计划在changeWeather中改变isHot*/
  changeWeather(){//原型上的changeWeather方法
    /*JSX对象中的方法默认开启严格模式严格模式下this是undefind*/
    console.log(this)
  }
}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))

2、通过setState改变state

class MyComponent extends React.Component{
  //执行1次
  constructor(props){
    super(props)
    this.state={isHot:true}
    /*将原型上的changeWeather放在实例上,并且更改changeWeather中this指向,如果没有这句changeWeather中this是undefind
    this.changeWeather=this.changeWeather.bind(this)
    /*console.log(this.changeWeather,'changeWeather')*/
  }
  /*执行1+n*/
  render(){
    let {isHot}=this.state
    return <div onClick={this.changeWeather}>今天天气{isHot?'热':"冷"}</div>
  }
  /*执行n次,n为点击次数*/
  changeWeather(){/*如果上边不改变this指向就是原型上的changeWeather方法,改变后直接调用自己的*/
    /*JSX对象中的方法默认开启严格模式严格模式下this是undefind*/
    /*console.log(this)*/
    /*状态必须经过setState改变,否则无效,并且是合并不是替换*/
    let isHot=this.state.isHot
    //this.state.isHot=!isHot /**是错的*/
    this.state.isHot=this.setState({isHot:!isHot})
  }
}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))

3、简写

class MyComponent extends React.Component{
  state = { isHot:false }
  render(){
    let {isHot}=this.state
    return <div onClick={this.changeWeather}>今天天气{isHot?'热':"冷"}</div>
  }
  changeWeather=()=>{ /*这样写直接是在changeWeather实例上方法和属性,
    不能用function函数,应该是因为开了严格模式,箭头函数不绑定this,箭头函数this		是上下文*/
    //console.log(this,'changeWeather里的this')
    let isHot = this.state.isHot
    this.state.isHot=this.setState({isHot:!isHot})
  }
}
ReactDOM.render(<MyComponent/>,document.getElementById('test'))
2、props

在这里插入图片描述
展开运算符…可以赋值对象

class Student extends React.Component{
  render(){
    const {name,age,sex}=this.props /*接收传递过来的参数*/
    return (
      <ul>
        <li>年龄{age}</li>
        <li>名字{name}</li>
        <li>性别{sex}</li>
      </ul>)
  }
}
/*进行类型约束*/
Student.propTypes={
  name:PropTypes.string.isRequired //字符串必填
}
Student.defaultProps={
  sex:"不男不女" //默认值
}
ReactDOM.render(<Student name="" age={18} />,document.getElementById('test'))

简写形式


    class Student extends React.Component {
      static PropTypes  = { /*定义静态属性:静态属性即为类设置属性,
      而不是为生成的对象设置,下面是原理实现*/
        name: PropTypes.string.isRequired //字符串必填
      }
      static defaultProps = {
        sex: "不男不女" //字符串必填
      }
      render() {
        const { name, age, sex } = this.props /*接收传递过来的参数*/
        return (
          <ul>
            <li>年龄{age}</li>
            <li>名字{name}</li>
            <li>性别{sex}</li>
          </ul>)
      }
    }
    Student.propTypes = {
      name: PropTypes.string.isRequired //字符串必填
    }
    Student.defaultProps = {
      sex: "不男不女" //字符串必填
    }
    ReactDOM.render(<Student name="" age={18} />, document.getElementById('test'))

函数式组件没有refs和state但是有props

function Student(props) {
      let { name, age, sex } = props
      return (
        <ul>
          <li>年龄{age}</li>
          <li>名字{name}</li>
          <li>性别{sex}</li>
        </ul>)
    }
    Student.propTypes = {
      name: PropTypes.string.isRequired //字符串必填
    }
    Student.defaultProps = {
      sex: "不男不女" //字符串必填
    }
    ReactDOM.render(<Student name="yuru" age={18} />, document.getElementById('test'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值