zoukankan      html  css  js  c++  java
  • 01脚手架+JSX+条件渲染+循环渲染+样式处理+组件(函数组件+class类组件)+事件处理+state数据+表单处理(受控+非受控)

    1.1 什么是React

      React 是一个用于构建用户界面的javaScript库,起源于facebook的内部项目,后续在13年开源了出来

      特点:声明式、基于组件、学习一次,随处使用

    1.2 React基本使用

      1.React的安装

    npm init -y
    npm i react react-dom 

      2.React的使用

      myh1.html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <!-- 1.引入 -->
      <script src="./node_modules/react/umd/react.development.js"></script>
      <script src="./node_modules/react-dom/umd/react-dom.development.js"></script>
    </head>
    
    <body>
    
      <div id="root"></div>
    
      <script>
        //   2.创建react元素
        let myh1 = React.createElement("h1", null, "我是h1")
    
        // 3.渲染到页面
        ReactDOM.render(myh1, document.getElementById("root"))
      </script>
    </body>
    
    </html>

    1.3 React脚手架

      1.初始化项目,命令: 

    npx create-react-app my-pro

       npx 目的:提升包内提供的命令行工具的使用体验  (my-pro 自己定义的项目名称)

      原来:先安装脚手架包,再使用这个包中提供的命令,现在:无需安装脚手架包,就可以直接使用这个包提供的命令

      2.启动项目,在项目根目录执行命令: 

    cd my-pro
    npm start

       打开项目后只留下index.js即可(入口文件,相当于vue的main.js,App.js相当于vue的App.vue根基组件)

    // 1 引入 react react-dom
    import React from 'react'
    import ReactDOM from 'react-dom'
    
    // 2 创建react元素
    let mydiv=React.createElement("div",{className:"box"},'我是div')
    
    // 3 渲染到页面
    ReactDOM.render(mydiv,document.getElementById("root"))

      

    2.JSX的使用

    2.1 概述

      JSX产生的原因:由于通过createElement()方法创建的React元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,用户体验不爽

      JSX的概述:jsx 在js中可以写 html

    2.2 简单入门使用

    import React from 'react'
    import ReactDom from 'react-dom'
    
    let mydiv = < h1 > 我是通过JSX创建的元素11</h1>
    
    ReactDom.render(mydiv, document.getElementById("root"))nt.getElementById("root"))

      JSX 不是标准的ECMAScript语法,它是ECMAScript的语法拓展,需要使用babel编译处理后,才能在浏览器环境中使用 ,编译JSX语法的包: @bable/preset-react

      React元素的属性名使用驼峰命名法

      特殊属性名:class -> className,for -> htmlFor,tabindex -> tabIndex

    2.3 JSX语法

      语法:{JavaScritp表达式}

    let content = '插入的内容'
    let h1 = <h1>我是通过JSX创建的元素+ {content}</h1>

      注意:只能写简单的三元表达式、变量、+-*/%四则运算

      在 react中 没有 v-if v-for类似的 指令 react写法类似 原生js

    3.1 条件渲染

      根据不同的条件来渲染不同的JSX结构---if 或者三元

    import React from 'react'
    import ReactDom from 'react-dom'
    
    // 条件渲染
    let isLoading = false
    let mydiv = ''
    
    if (isLoading) {
      mydiv = < div > Loading... </div>
    } else {
      mydiv = < div > 加载完成 </div>
    }
    
    ReactDom.render(mydiv, document.getElementById("root"))

    3.2 列表渲染

       map()方法循环数组,把return后面的值组成一个新数组返回,尽量减少使用索引代表key

      数组.map(function(item,index,arr){})

    import React from 'react'
    import ReactDom from 'react-dom'
    
    // 循环渲染
    let arr = [
      { id: 1, name: '三国演义' },
      { id: 2, name: '水浒传' },
      { id: 3, name: '红楼梦' },
      { id: 4, name: '西游记' },
    ]
    
    // let mydiv = <ul > {
    //     arr.map(function(item, index, arr) {
    //       return <li key = { item.id } > 名字: { item.name } </li>
    //     })
    //   } </ul>
    
    let mydiv = <ul > {
      arr.map(item => {
        return <li key = { item.id } > 名字: { item.name } </li>
      })
    } </ul>
    
    
    ReactDom.render(mydiv, document.getElementById("root"))

    4. 样式处理

      index.css

    .box {
      color: red;
      background-color: pink
    }

      index.js

    import React from 'react'
    import ReactDom from 'react-dom'
    import './index.css'
    
    // let mydiv=<div>
    //     <p style={ {'color':'red',"backgroundColor":"pink"} }>123</p>
    //     </div>
    
    let mydiv = <div >
      <p className = "box" > 123 </p>
      </div>
    
    ReactDom.render(mydiv, document.getElementById("root"))

    5.  React组件(函数组件+class类组件)

      函数组件  1.首字母大写  2.必须有返回值 return   return null

    import React from 'react'
    import ReacrDOM from 'react-dom'
    
    // 函数组件
    function Header() {
      return <div >
        我是div 
        </div>
    }
    
    ReacrDOM.render( < Header > </Header>,document.getElementById('root'))

      class类组件

    import React from 'react'
    import ReacrDOM from 'react-dom'
    
    // class类组件
    class Header extends React.Component {
      render() {
        return <div > 我是div1 </div>
      }
    }
    
    ReacrDOM.render( < Header > </Header>,document.getElementById('root'))

       ES6中的class类

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <script>
        // function Person() {
        //   this.name = '建林',
        //     this.money = '壹佰亿'
        // }
        // let p1 = new Person()
        // console.log(p1.money)  //壹佰亿
    
        class Person {
          name = '建林'
          money = '壹佰亿'
        }
        let p2 = new Person()
        console.log(p2.name) //建林
    
        // class Son extends Person {
        //   name = '思聪'
        // }
    
        class Son extends Person {
          constructor() {
            super()  //超级也就是class Person
            this.name = '思聪'
          }
        }
    
        let p3 = new Son()
        console.log(p3.name) //思聪
      </script>
    </body>
    
    </html>

       独立组件

      components/Footer.js

    import React from 'react'
    
    export default class Footer extends React.Component {
      render() {
        return ( <
          div > 我是Footer组件 </div>
        )
      }
    }

    // 3 导出组件也可
    //export default Footer

      index.js

    import React from 'react'
    import ReacrDOM from 'react-dom'
    
    import Footer from './components/Footer'
    
    ReacrDOM.render( < Footer> </Footer>,document.getElementById('root'))

    5.1  React事件绑定

       语法:on+事件名称=事件处理函数,比如 onClick = function(){}

      注意:React事件采用驼峰命名法

    import React from 'react'
    import ReacrDOM from 'react-dom'
    
    class Header extends React.Component {
      clickHandeld() {
        console.log('别点了,疼死了')
      }
      render() {
        return ( //return 后面必须有东西
          <button onClick = { this.clickHandeld } > 按钮点击 </button>  //this指的是class Header
        )
      }
    }
    
    ReacrDOM.render( < Header > </Header>,document.getElementById('root'))

    5.2 React事件对象  

      可以通过事件处理函数的参数获取到事件对象

      React中的事件对象叫做:合成事件(兼容所有浏览器,无需担心跨浏览器兼容问题)

      除兼容所有浏览器外,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation()preventDefault()

      如果你想获取到原生事件对象,可以通过 nativeEvent 属性来进行获取

      注意:this.clickHandeld后不加()否则会自动触发一次

    import React from 'react'
    import ReacrDOM from 'react-dom'
    
    class Header extends React.Component {
      clickHandeld(e) {
        // console.log('别点了,疼死了')
        // e.preventDefault()  //阻止行为
        console.log(e.nativeEvent)  // 获取原生事件对象
      }
      render() {
        return ( //return 后面必须有东西
          <button onClick = { this.clickHandeld } > 按钮点击 </button>
        )
      }
    }
    
    ReacrDOM.render( < Header > </Header>,document.getElementById('root'))

    支持的事件

    • Clipboard Events 剪切板事件

      • 事件名 :onCopy onCut onPaste

      • 属性 :DOMDataTransfer clipboardData

    • compositionEvent 复合事件

      • 事件名: onCompositionEnd onCompositionStart onCompositionUpdate

      • 属性: string data

    • Keyboard Events 键盘事件

      • 事件名:onKeyDown onKeyPress onKeyUp

      • 属性: 例如 number keyCode 太多就不一一列举

    • Focus Events 焦点事件 (这些焦点事件在 React DOM 上的所有元素都有效,不只是表单元素)

      • 事件名: onFocus onBlur

      • 属性: DOMEventTarget relatedTarget

    • Form Events 表单事件

      • 事件名: onChange onInput onInvalid onSubmit

    • Mouse Events 鼠标事件

      • 事件名:

        onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
        onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
        onMouseMove onMouseOut onMouseOver onMouseUp
    • Pointer Events 指针事件

      • 事件名:

        onPointerDown onPointerMove onPointerUp onPointerCancel onGotPointerCapture
        onLostPointerCapture onPointerEnter onPointerLeave onPointerOver onPointerOut
    • Selection Events 选择事件

      • 事件名:onSelect

    • Touch Events 触摸事件

      • 事件名:onTouchCancel onTouchEnd onTouchMove onTouchStart

    • UI Events UI 事件

      • 事件名: onScroll

    • Wheel Events 滚轮事件

      • 事件名:onWheel

      • 属性:

        number deltaMode
        number deltaX
        number deltaY
        number deltaZ
    • Media Events 媒体事件

      • 事件名:

        onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted
        onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay
        onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend
        onTimeUpdate onVolumeChange onWaiting
    • Image Events 图像事件

      • 事件名:onLoad onError

    • Animation Events 动画事件

      • 事件名:onAnimationStart onAnimationEnd onAnimationIteration

    • Transition Events 过渡事件

      • 事件名:onTransitionEnd

    • Other Events 其他事件

      • 事件名: onToggle

    5.3 有状态组件有state数据和无状态组件

      函数组件又叫做 无状态组件,类组件又叫做 有状态组件
      状态(state) 即数据
      函数组件没有自己的状态,只负责数据展示
      类组件有自己的状态,负责更新UI,让页面动起来

    5.4 State

      状态(state)即数据,是组件内部的私有数据,只能在组件内部使用
      state的值是对象,表示一个组件中可以有多个数据
      通过this.state来获取状态


      基本使用

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class My extends React.Component {
      // 方法一:
      //   constructor() {
      //     super()
      //     this.state = {
      //       count: 0
      //     }
      //   }
    
      // 方法二:
      state = {
        count: 1
      }
    
      render() {
        return <div > 计数器: { this.state.count } </div>
      }
    }
    
    ReactDOM.render( < My > </My>,document.getElementById("root"))  

    5.5 State和SetState

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class My extends React.Component {
      // 方法一:
      //   constructor() {
      //     super()
      //     this.state = {
      //       count: 0
      //     }
      //   }
    
      // 方法二:
      state = {
        count: 1
      }
    
      render() {
        return (
            <div>
                <div> 计数器:{ this.state.count}</div>
        <button onClick = {
            () => {
              this.setState({
                count: this.state.count + 1
              })
            }
          }> +1 </button>
            </div>
        )
      }
    }
    
    ReactDOM.render( <My> </My>,document.getElementById("root"))

    5.6 抽取事件处理函数

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class My extends React.Component {
      // 方法一:
      //   constructor() {
      //     super()
      //     this.state = {
      //       count: 0
      //     }
      //   }
    
      // 方法二:
      state = {
        count: 1
      }
    
      addCount(){
        this.setState({
            count: this.state.count + 1
        })
        }
    
      render() {
        return (
            <div>
                <div> 计数器:{ this.state.count}</div>
                {/* <button onClick = {() => {
                    this.setState({
                        count: this.state.count + 1
                    })
                    }
                }> +1 </button> */}
                <button onClick = {this.addCount}> +1 </button>
            </div>
        )
      }
    }
    
    ReactDOM.render( <My> </My>,document.getElementById("root"))

      在JSX中我们写的事件处理函数可以找到this,原因在于在JSX中我们利用箭头函数,箭头函数是不会绑定this,所以会向外一层去寻找,外层是render方法,在render方法里面的this刚好指向的是当前实例对象

      1.改为箭头函数就不会报错了

        addCount=()=>{
        this.setState({
            count: this.state.count + 1
        })
        }

       2.在外层包裹箭头函数

    <button onClick = {()=>{
                    this.addCount()
                }}> +1 </button>

      3.bind改变this指向(现在this指向My)

    <button onClick = {this.addCount.bind(this)}> +1 </button>

    6. state操作--受控组件与非受控组件

       受控组件/表单(当没有onChange事件时,报错)

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class My extends React.Component{
        state={
            username:'张三'
        }
    
        changevalue=(e)=>{
            this.setState({
                username:e.target.value
            })
        }
    
        render(){
            console.log(this.state)
            return(
                <div>
                    <p>{this.state.username}</p>
                    <input type="text" value={this.state.username} onChange={this.changevalue}></input>
                </div>
            )
        }
    }
    
    ReactDOM.render(<My />,document.getElementById('root'))

      非受控组件/表单----不用state 单纯只想ref操作dom获取文本框值

      调用 React.createRef() 方法创建ref对象
      将创建好的 ref 对象添加到文本框中
      通过ref对象获取到文本框的值

      

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class App extends React.Component{
        inputRef=React.createRef()
        getvalue=()=>{
            console.log(this.inputRef)
            console.log(this.inputRef.current.value)
        }
        render(){
            return<div>
                <input type="text" ref={this.inputRef} />
                <button onClick={this.getvalue}>点击获取数值</button>
            </div>
        }
    }
    
    ReactDOM.render(<App />,document.getElementById("root"))

      

  • 相关阅读:
    html_py
    PHP-FPM详解
    nginx 虚拟主机配置
    正确配置Nginx+PHP
    centos7安装Nginx
    如何让浏览器关闭后session失效
    微擎中消息响应回复 代码流程
    在vue组件库中不能使用v-for
    微信分享前面
    php接受axios数据
  • 原文地址:https://www.cnblogs.com/meiqiyuanzi/p/12131954.html
Copyright © 2011-2022 走看看