react语法结构

2019-09-29  本文已影响0人  光头小青蛙

1.react JSX语法原理

class Header extends Component {
  render () {
    return (
      <div>
        <h1>React 小书</h1>
      </div>
    )
  }
}
ReactDOM.render(
  <Header />,
  document.getElementById('root')
)

为什么要有JavaScript这一层,就是因为,在转换的时候,可能不是转换成DOM可能是转换成react -app(react-native),所以会有JavaScript这一层作中转。

<div class='box' id='content'>
  <button>Click</button>
</div>
{
  tag: 'div',
  attrs: { className: 'box', id: 'content'},
  children: [
    {
      tag: 'button',
      attrs: null,
      children: ['Click']
    }
  ]
}

2.组件render方法

import React, { Component ,Fragment} from 'react';

render () {
  const badWord = <span> is not good</span>
  return (
    <div>
      <h1>
        React 小书
        {badWord}
      </h1>
    </div>
  )
}

3.组件嵌套

注意自定义组件必须要使用大写的字母开头。

class Title extends Component {
  render () {
    return (
      <h1>React 小书</h1>
    )
  }
}
class Header extends Component {
  render () {
    return (
      <div>
        <Title />//嵌套组件
      </div>
    )
  }
}

4.事件绑定

class Everything extends Component{
  bodyClick(){
  console.log(this)
}
render(){
    return (
        <div onClick={this.bodyClick.bind(this)} className="Header" style={bodyStyle}>
          我是身体
      </div>
)
}

4.类名ID样式设置

react.js在解析的时候遇见<会解析为html,遇见{会以javascript解析。所以不能放在""里面。

class Body extends Component {
  render() {
    let bodyStyle={
      color:"blue",
      height:"100px",
      fontSize:"20px",
      lineHeight:"100px"
    }
    return (
      <div data-name="der" id="der"  className="Header" style={bodyStyle}>
          <h1 style={{fontSize:"50px"}}>today</h1>
      </div>
    );
  }
}

5,组件state状态设置

  constructor(){
    super()
    this.x=123;
    this.y=123;
    this.state={
      name:"xiaoming",
      flag:false
    }
  }
  bodyClick(e){
    this.setState({
      name:"123",
      flag:!this.state.flag
    })
    this.setState((prevState)=>{
    console.log(prevState)//name:123,flag:true可以获取到改动之后的值。
    })
  }

6,props组件传参

class Body extends Component {
  bodyClick(e){
    console.log(this.props)
    if(this.props.fun){
      this.props.fun();
    }
  }
    static defaultProps = {//设置默认值
        title: '取消',
        unlikedText: '点赞'
    }
  render() {
    return (
      <div    onClick={this.bodyClick.bind(this)} className="Header">
        <h1>{this.props.content.name}{this.props.title?this.props.title:"failed"}</h1>
      </div>
    );
  }
}
class App extends Component {
  render() {
    return (
      <div className="App">
      <Body der={['123']} fun={()=>{console.log("传了个函数")}} content={{name:"name"}} title="props标题"></Body>
      </div>
    );
  }
}

7.列表数据渲染

第一种
class Other extends Component{
    render(){
        let arr=['第一页','第一页','第一页','第一页','第一页','第一页','第一页','第一页',]
        let array=[]
        arr.forEach((item,index)=>{
           array.push( <div   className={index===0?'navActive menu-list':'menu-list'} key={index}>{item}</div>)
      })
        return (
            <div className="left-menu-wrapper">
                { array}
            </div>
        )
    }
}
第二种
class Other extends Component{
    render(){
        let arr=['第一页','第一页','第一页','第一页','第一页','第一页','第一页','第一页',]
        let array=arr.map((item,index)=>{
              return   <div   className={index===0?'navActive menu-list':'menu-list'} key={index}>{item}</div>
        })
        return (
            <div className="left-menu-wrapper">
                { array}
            </div>
        )
    }
}
第三种
    render(){
        let arr=['第一页','第一页','第一页','第一页','第一页','第一页','第一页','第一页',]
            return (
                <div className="left-menu-wrapper">
                    {
                        arr.map((item,index)=>{
                            return   <div  onClick={this.navTab} className={index===0?'navActive menu-list':'menu-list'} key={index}>{item}</div>
                        })
                    }
                </div> 
            )
    }

8.生命周期

class Toder extends Component{
    constructor(){
        super();
        this.contentArr=[];
        this.state={
            contentArr:[]
        }
    }
    UNSAFE_componentWillReceiveProps(nextProps){
        console.log("props改变")
    }
    UNSAFE_componentWillMount(){
        console.log("组件开始渲染")
    }
    UNSAFE_componentWillUpdate(){
        console.log("组件重新渲染")
    }
    UNSAFE_componentDidUpdate(){
        console.log("组件重新渲染完毕")
    }
    componentWillUnmount(){
        console.log("组件销毁")
    }
    render(){
        return (
            <div className="comment-wrapper">
            </div>
        )
    }
}

9.DOM操作

函数
<button ref={(dom)=>{console.log(dom)}} >点击</button>
字符串
 <div ref="ggg" className="comment-wrapper">
 </div>

10.容器类组件

定义props组件
class Body extends Component {
  constructor(){
    super();
    this.state={
      title:"123"
    }
  }
  btnClick(){
    console.log(this.state)
  }
  render() {
    let content=<div>
        <input placeholder="请输入内容" type="text"/>
        <button onClick={this.btnClick.bind(this)}>删除</button>
    </div>
    return (
      <div className="body-container">
        <Toder content={content} title={this.state.title}></Toder>
      </div>
    );
  }
}
容器组件
class Toder extends Component{
    constructor(){
        super();
        this.contentArr=[];
        this.state={
            contentArr:[]
        }
    }
    UNSAFE_componentWillMount(){
        console.log(this.props.content.props)
    }
    render(){
        return (
           <div>
                <div style={{backgroundColor:"skyblue"}}>{this.props.content.props.children[0]}</div>
                <div style={{backgroundColor:"pink"}}>{this.props.content.props.children [1]}</div>
           </div>
        )
    }
}

11.渲染html字符串

注意标签中间不能有任何内容包括空格和换行。

    render(){
        return (
            <div dangerouslySetInnerHTML={{__html: this.state.text}}></div>
        )
    }

12. 验证props

先引入
import PropTypes from "prop-types"
再设置验证
class Item extends Component {
    constructor(){
        super()
        this.state={

        }
    }
    handleClick(){
        this.props.delItem(this.props.index)
    }
    render() { 
        return ( 
            <li onClick={this.handleClick.bind(this)}>{this.props.item}</li>
         );
    }
}
Item.propTypes={
    index:PropTypes.number.isRequired
}
上一篇 下一篇

猜你喜欢

热点阅读