React(0x01)-react基础

React基础

React 简介

  • 2013年由Facebook推出且开源

  • 函数式编程

    • 代码主要是函数构成,有利于前端自动化测试
  • 声明式开发(React、Vue)

    • 命令式编程 ---- jQuery
  • 单向数据流

    • 父组件只给子组件传递数据 ,子组件不能直接修改父组件的数据,如果子组件要修改父组件的数据,需要通过调用父组件的方法来实现
  • 视图层框架

  • React官网

    v16.3.2

React开发环境的搭建

  • 使用React脚手架(Create React App)创建单页应用

    npx create-react-app <新建项目名称>  
        
    以上命令等价于
    npm install -g create-react-app
    create-react-app <新建项目名称>  
    
    • 2 终端切换到项目目录下
    cd <项目名称>
    
    • 3 开启项目
    npm start
    

React单页应用初始目录详解

初始时主要文件目录

  • public(发布文件)
    • index.html
    • manifest.json(与pwa对应的文件)
  • src(源文件)
    • App.css
    • App.js
    • App.test.js
    • index.css
    • index.js(入口文件)
    • logo.svg(首页使用的图片)
    • serviceWorker.js(与pwa对应的文件)
    • setupTest.js

修改初始目录用于初始开发

  • public(发布文件)

    • index.html

      • 删除对manifest.json文件的引用

          <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />    --- 删除
        
    • manifest.json(与pwa对应的文件) --- 删除

  • src(源文件)

    • App.css --- 删除

    • App.js

      //修改删除已删除的引用
      
      import React from 'react';
      
      function App() {
        return (
          <div >
            hello word
          </div>
        );
      }
      
      export default App;
      
    • App.test.js --- 删除

    • index.css --- 删除

    • index.js(入口文件)

      //修改删除已删除的引用
      
      import React from 'react';
      import ReactDOM from 'react-dom';
      import App from './App';
      
      ReactDOM.render(
        <React.StrictMode>
          <App />
        </React.StrictMode>,
        document.getElementById('root')
      );
      
    • logo.svg(首页使用的图片) --- 删除

    • serviceWorker.js(与pwa对应的文件) --- 删除

    • setupTest.js --- 删除

PWA

pwa( Progressive Web App )主要作用是软件会缓存已经加载的页面,在断网后可以正常显示已经加载过的页面,提高用户体验。

React编码规范

1 组件首字母

  • 自定义组件标签首字母大写,react原生组件标签首字母小写

2 函数this重定向

  • 写在构造函数中
constructor(props) {
    super(props)
    this.itemDel = this.itemDel.bind(this)
  }

3 this.props解构

  • 子组件使用父组件传入的数据 --- 解构后使用

     //原始写法
     this.props.itemDel(this.props.index)
     
     //解构后的写法
     const {itemDel, index} = this.props
     itemDel(index)
    
    
    //案例:
     render() {
        const { content, text } = this.props 
        return (
          <div>
            {text}-{content}
            <button onClick = {this.itemDel} >删除</button>
          </div>
        )
      }
    

4 setState()传入函数

  • setState()传入函数不再是传入对象

    //传入对象形式
    this.setState({
        属性: 值
    })
    
    //传入函数  ----  可以实现异步
    this.setState(() => {
        return {
            属性: 值
        }
    })
    this.setState((prevState) => {    //prevState相当于this.state  
        return {
            属性: 值
        }
    })
    
    • 案例1

      const value = e.target.value   // 注意现在外面定义 再用 不要直接在setState中用
      this.setState(() => {
        return {
          inputValue: value
        }
      })
      
      // ES6 箭头函数简写
      const value = e.target.value  
      this.setState(() => ({
          inputValue: value
        }))
      
    • 案例2

      //传入对象写法
      this.setState({
        list: [...this.state.list, this.state.inputValue],
        inputValue: ''
      })
      
      //传入函数写法
      this.setState((prevState) => ({
        list: [...prevState.list, prevState.inputValue],
        inputValue: ''
      }))
      
    • 案例3

      //传入对象写法
      const list = [...this.state.list]
      list.splice(index, 1)
      this.setState({
        list
      })
      
      //传入函数写法
      this.setState((prevState) => {
        const list = [...prevState.list]
        list.splice(index, 1)
        return {list}
      })
      

React组件的使用基础

  • --1-- : 组件构造函数
  • --2--: 父组件(Component) 的构造函数
  • --3--: 存储组件的数据
  • --4--: 组件的html --- JSX
  • --5--: React组件的标签必须有一个根标签,可以是<div>,但是<div>会在DOM中渲染出来,为了不渲染,用<Fragment>来占位,起到跟标签的作用
  • --6--: jsx中用‘{}’包裹js代码
  • --7--: React中绑定事件: 将原生事件写成驼峰式即可 在.bind中传递参数
  • --8--: 将事件函数的this绑定为组件的this,以便在事件函数中通过this访问组件
  • --9--: 循环数组 注意绑定key
  • --10--: 修改Reat组件中的数据 需要通过this.setState({})函数来修改
import React, {Component, Fragment} from 'react'

class TodoList extends Component {
  constructor(props) {  //--1-- 
    super(props)        //--2--
    this.state = {      //--3--
      inputValue: 'hello',
      list: []
    }
  }

  render() {           // --4--
    return (           // --5--
      <Fragment>      
        <div>
          <input value = {this.state.inputValue}      // --6--
                 onChange = {this.changeInputValue.bind(this)}   //--7-- --8--
          />
          <button onClick = {this.submitInput.bing(this)}>提交</button>
        </div>
        <ul>
            {
              this.state.list.map(item => {   // --9--
                return (
                <Fragment  key={index}>   
                <li key={index}>{item}</li>
                <button onClick = {this.itemDel.bind(this, index)} key={index+1}>删除</button>                                              // --8--
                </Fragment>
                )
              })
            }
        </ul>
      </Fragment>
    )
  }

  changeInputValue(e){
    this.setState({    //--8--    --10--
      inputValue: e.target.value
    })
  }

  submitInput(){
    this.setState({
      list: [...this.state.list, this.inputValue]  
    })
  }
}

export default TodoList;

JSX语法

JSX就是在js代码中写的html标签的语法

  • JSX中写注释

    {/*注释内容*/}
    
    {
      //注释内容
    }
    
  • 绑定样式: className 注意不是class

    <div className='calss1'></div>
    
  • 不转义显示带有html标签的字符串

    //item:‘<h1>hello word</h1>’   -----  react组件中的数据
    
    <div dangerouslySetInnerHTML={{__html: item}}></div>
    
    
    这种方式在界面不会显示
    <h1>hello word</h1>  
    而是
    hello word  且是一号标题的字体大小
    
  • <label>标签的for改为htmlFor

    <label htmlFor="insert">输入内容</label> 
    <input id="insert" />
    

组件间通信

1 父级向子级传递数据

  • 实现步骤

    1. 父组件中通过属性(自定义)绑定要传递的数据
    //子组件:<TodoItem/>
    //自定义属性:content
    //父组件中的数据:item   注意:{} 包裹
    <TodoItem content = {item}/>
    
    1. 子组件中通过this.props.属性取到父组件传入的数据
    //自定义属性:content
    this.props.content
    

2 子级向父级传递数据

  • 子级向父级传递数据是通过子组件调用父组件的方法,给方法传值实现的。这个操作包括两个功能:

    • 1 子组件调用父组件的方法;
    • 2 子组件向父组件传递数据
  • 实现步骤:

    1. 父组件中通过属性(自定义)绑定子级可调用的方法
    //子组件:<TodoItem/>
    //自定义属性(方法名):itemDel
    //父组件中的方法:itemDel   注意:{} 包裹  this重定向
    <TodoItem itemDel = {this.itemDel.bind(this)}/>
    
    1. 子组件中通过this.props.属性(自定义方法名)调用父组件的方法
    //自定义属性(方法名):itemDel
    //父组件中该方法需要的参数: this.props.index
    this.props.itemDel(this.props.index)
    
    1. 父组件中接收子组件传来的数据
    itemDel(index){
      console.log(index)   //若该函数调用方是组件,则这个index就是子组件传来的
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351