react基础

react基础

基础语法

  • 引入文件

    • <script src="../base/react.min.js"></script>
  • 相当于vue.js 提供的是React对象

  • <script src="../base/react-dom.min.js"></script>

    • 提供了ReactDOM 对象

    • 网页 B(browser)/S(server) webapp dom bom

      react基本语法 + react-dom 可以写网页

    • app C(client)/s(Server) 手机硬件以及ui

      react基本语法 +react-native 可以写app

  • <script src="../base/browser.min.js"></script>

    • 帮助浏览器解析jsx语法糖
  • 创建组件

    • 组件是虚拟dom

    • 组件名开头必须大写

      let Component = React.createClass({
        render() {
          // render 函数内部 返回jsx 其中()不是必须的只是表示这里的是jsx
          return (
            <h1> 你好世界</h1>
          )   
        }
      })
      
  • 挂载组件

    • 将虚拟dom通过 ReactDOM.render(组件标签,要挂载的元素)
ReactDOM.render(<Component/>,document.getElementById('app'))

jsx 语法糖

  • javascript xhtml 严格模式下的html
    • 必须只有一个根元素
    • 标签必须闭合

数据承载

  • vue 中一个组件的数据2中 一种 组件内部的data 一种是来自组件外部的props

  • react数据承载也有两个

    • state
      • state 类似于vue中的data 组件自己的数据 可以随便的修改
      • getInitailState 生命周期初始化
    • props
      • 和vue一样来自组件外.只读
      • 用getDefaultProps 进行初始化
  • 外部传递和组件内部初始化同时存在以外部传递优先

    let Hehe = React.createClass({
        //根据挂载的数据不同这里决定用getInitialState或getDefaultProps
      getInitialState(){
        console.log('初始state的生命周期')
        return {
          name:'韩梅梅'
        }
      }
    

数据绑定

  • react 数据绑定{变量或者表达式} 和vue中的 {{ }} 一样一样的
  • jsx 不能直接绑定对象
  • jsx 绑定数组 会将数组的每一项拆分出来 渲染到页面上
  • boolean null undefined 不会再页面上直接渲染 但是可以使用3元表达式
  • 其他的基本类型该怎么渲染就怎么渲染

列表渲染

  • react中的条件渲染依赖于 绑定数组会将数组的每一项拆分出来
    • 利用map遍历出数组每一项
let Component = React.createClass({
  getInitialState(){
    return{
      list:['咒怨','午夜凶铃','红色高跟鞋','死亡来电','阴阳瞳']
    }
  },
  render() {
    return (
      <ul>
        {this.state.list.map((item,index)=>{
          return(
            <li>{item}</li>
          )
        })}
      </ul>
    )
    
  }
})

ReactDOM.render(<Component/>,document.getElementById('app'))
  • 也可封装出一个函数.

     renderList(){
        // 函数的返回结果
       return this.state.list.map((item,index)=>{ 
        // map 每一项的返回
         return(
           <li>{item}</li>
         )
       })
      },
      render() {
        return (
          <ul>
            {this.renderList()}
          </ul>
        )
        
      }
    

条件渲染

  1. 通过三元表达式控制渲染不渲染

  2. 表达式1||表达式2 运算符

  3. 函数实现

    • 中心思想就是在数据中给一个状态,通过状态的改变来控制是否渲染

      let Component = React.createClass({
        getInitialState(){
          return{
            show:false
          }
        },
        renderDiv(){
          let result = null 
          if(this.state.show){
            result  =  (<div id = 'test'></div>)
          }
          return result 
        },
        render() {
          console.log(this)
          // 解构赋值 取出数据
          let {show} =  this.state 
          return (
            <div>
             {/*{show?"显示":'隐藏'}*/} 
             {/*{show?<div id='test'></div>:''}*/}
             {/*{!show||<div id='test'></div>}*/}
             {this.renderDiv()}
            </div>
          )
          
        }
      })
      

属性绑定

  1. 属性绑定

    希望属性的值是变量

    <img src={变量或者表达式}>

    注意类名要用className

事件绑定

  • react事件和原生事件类似只需要把事件名写成小驼峰就ok

    原生 <div onclick=''></div>

    react <div onClick=''></div>

  • onClick={(e)=>{

    事件处理代码

    }}

  • 不带参数 默认参数是事件对象 千万别加()

    onClick={this.fun//函数}

  • 带参数 通过bind实现 默认参数会放到最后方

    onClick={this.fun.bind(null,4,6)}

响应式

  • 通过setState触发页面的修改
  • this.setState({要修改的数据:修改的内容},回调)
  • setState 是一个异步方法
  • 参数1是要修改的数据
  • 参数2是修改成功之后的回调

组件嵌套

  • 组件的嵌套关系随意 谁在外部谁是爸爸

插槽

  • <组件>内部内容</组件>

  • 使用组件内部的内容默认不会被渲染

  • 可以使用this.props.children预留一块空间来渲染可能要用到的内容

    let Component = React.createClass({
      render(){
        return(
          <div className='test1'> 
            这是组件1
            <Son>
            //这里默认不会被渲染.但可以在组件内容预留下一块空间来渲染
              政治老师:底层基础,·决定高层建筑
            </Son>
          </div>
        )
      }
    })
    //创建组件二
    let Son = React.createClass({
      render(){
        console.log(this)
        return (
          <div className='test2'>
           //预留一块空间来渲染可能添加的内容
            <h1>{this.props.children}</h1>
          </div>
        )
      }
    })
    

ref

  • 可以绑定dom 也可以绑定组件

    通过组件对象下的 refs进行获取

    let Son = React.createClass({
      render(){
        return (
          <div className='test2'>
            这里是组件二
            <h1 ref='hehe'>体育老师:受伤了就别逞强了</h1>
            <button onClick={()=>{
              console.log(this.refs.hehe)
            }}>点击</button>
          </div>
        )
      }
    })
    
  • 绑定之后可以获取到绑定组件的一切方法 可以实现在父组件中调用子组件的方法

    let Component = React.createClass({
      render(){
        return(
          <div className='test1'> 
            这是组件1
            <button onClick={()=>{
              console.log(this)
              this.refs.son.sayHello()
            }}>点击</button>
            <hr/>
          //绑定子组件
            <Son ref='son'></Son>
          </div>
        )
      }
    })
    

组件通信

  • 需要修改的数据和修改数据的方法要放到一起.

  • 父子通信 props refs

    子父通信 props

    亲兄弟通信 状态提升

    远亲通信 全局状态管理 redux

    let Father = React.createClass({
      getInitialState(){
        return{
          hair:'五颜六色 长发披肩'
        }
      },
      render(){
        return(
          <div className='father'>
          <h3>这里是父组件</h3> 
          <button onClick={()=>{
            this.setState({hair:'小平头'})
          }}>改过自新回头是岸</button>
          <hr/>
          {/*父组件通过自定义属性 将自己的数据传奇给子组件*/}
          <Son hair={this.state.hair}></Son>
          </div>
        )
      }
    })
    
    let Son = React.createClass({
      render(){
        return(
          <div className='son'>
          <h3>子组件</h3> 
            //子组件通过props属性来接受
           头发:{this.props.hair}
          </div>
        )
      }
    })
    
  • ref

    let Father = React.createClass({
      render(){
        return(
          <div className='father'>
          <h3>这里是父组件</h3> 
           <button onClick={()=>{
            //  父组件通过refs强行调用子组件的理发方法
             this.refs.son.change()
           }}>强制措施</button>
           <Son ref='son'></Son>
          </div>
        )
      }
    })
    let Son = React.createClass({
      getInitialState(){
        return{
          hair:'五颜六色 长发披肩'
        }
      },
        //数据和处理数据的方法都在这里,同个ref把子组件的数据和方法都传给父组件.让父组件来调用.
      change(){
        this.setState({hair:'小平头'})
      },
      render(){
        return(
          <div className='son'>
          <h3>子组件</h3> 
           {this.state.hair}
          </div>
        )
      }
    })
    
  • 子父通信

    let Father = React.createClass({
      getInitialState(){
        return{
          name:"韩梅梅"
        }
      },
      changeName(name){
        this.setState({name:name})
      },
      render(){
        return(
          <div className='father'>
          <h3>这里是父组件</h3> 
          {this.state.name}
          
          <hr/>
          {/*通过props 传递方法*/}
          <Son fafun={this.changeName}></Son>
          </div>
        )
      }
    })
    
    let Son = React.createClass({
      render(){
        return(
          <div className='son'>
          <h3>子组件</h3> 
          <button onClick={()=>{
            console.log(this)
            // 调用父组件的方法
            this.props.fafun('李雷雷')
          }}>子组件的触发按钮</button>
          </div>
        )
      }
    })
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,439评论 1 33
  • React是一个Facebook和Instagram用来创建用户界面的JavaScript库,用于构建“可预期的”...
    前端工程狮_jam阅读 261评论 0 2
  • 结合最近对react项目优化的同时,对一些第一次看来感觉很容易,但是使用上容易搞混淆的东西再学习和整理一番。由于是...
    技术与健康阅读 319评论 0 1
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,833评论 1 18
  • 为了帮助大家快速上手React Native开发,在这本节中将向大家介绍开发React Native所需要的一些R...
    CrazyCodeBoy阅读 1,847评论 1 9