RN精进笔记(十一)React框架精读

[toc]

前言

React-Native = React + iOS/Android, 所以如果是APP开发工程师,本质上需要补充的是React框架层的知识。

其实React是Facebook 2014年开源的一个重量级前端框架,与Angular和Vue并称为前端开发三驾马车。

前端开发技术栈:Angular/Vue/React 三选一以及全家桶 、 webpack编译打包、ES6或TypeScript、Node.js ......

本文主要讲述前端开发技术栈的React栈,为react-native服务。

RN开发工程师绕不过的坎 React。

参考文献: React中文文档

参考文献:阮一峰React技术栈

安装
  1. 这里使用React开发新项目

    创建一个React项目并且运行

    $ npm install -g create-react-app
    
    $ create-react-app my-react-app 
    
    $ cd my-react-app 
    
    $ npm start 
    
    
    # 浏览器打开 localhost:3000 即可看到运行的页面
    
    
  2. 文件目录结构

    |-- package.json
    |-- package-lock.json
    |-- public
    |-- src |-- index.js
            |-- index.css
    |-- node-modules
    
    public 目录下有index.html文件,在index.js文件获取root根节点:
    ReactDOM.render(
     <h1>Hello, world!</h1>,
     document.getElementById('root')
     );
    
React 框架学习笔记
  1. JSX渲染

    React采用jsx渲染,并且允许嵌套、if语句。

    Babel编译器会把JSX转化成名为React.createElement()的方法

    React只会更新必要部分节点。因此它更加高效。

  2. 组件和Props & state & 生命周期

    定义组件:

    class UserInfo extends React.Component {
        render () {
            return <div>
             <Avatar user={this.props.user}></Avatar>
                <div>{this.props.user.name}</div>
            </div>
        }
    }
    

    Props只读性

    State 是组件的全局状态管理属性

    组件有自身的生命周期

    // 处理计时器组件 state、组件生命周期
    class Clock extends React.Component {
        constructor(props) {
        super(props);
        this.state = {date: new Date()};
    }
    componentDidMount() {
    }
    componentDidMount() {
        this.timeID = setInterval(
        () => this.tick(), 1000
        ); 
    }
    componentWillUnmount() {
    clearInterval(this.timeID);
      }
      tick() {
        this.setState({
          date: new Date()
        });
      }
      render () {
        return (
          <div>
            <h1>Hello, hhhhhh1!</h1>
            <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }
    
    
  3. 事件处理

    React中文文档之事件处理

    事件处理需要注意的是:

    定义好的事件必须绑定this,否则在编译阶段就会报错。

    // This binding is necessary to make `this` work in the callback
        this.handleClick = this.handleClick.bind(this);
    
    
  4. 条件渲染和列表和Keys

React支持条件渲染、三目运算符和 && 运算符

  1. 表单

    表单案例:

    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: ''};
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
      handleChange(event) {
        this.setState({value: event.target.value});
      }
      handleSubmit(event) {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
      }
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name: 
              <input type="text" value={this.state.value} onChange={this.handleChange}/>
            </label>
            <input type="submit" value="Submit"/>
          </form>
        )
      }
    }
    
  2. 高级

    使用PropTypes检查类型

    class Greeting extends React.Component {
      constructor(props) {
        super(props);
        this.myRef = React.createRef();
      }
      render() {
        return(
          <div ref={this.myRef}>
            <h1>Hello, {this.props.name}</h1>
          </div>
        );
      }
    }
    Greeting.propTypes = {
      name: PropTypes.Number
    }
    

    Refs和Dom

    Refs较为常用,可以尝试深入React Refs和Dom中文参考文档

  3. 高级

React 技术栈之路由:react-router

参考文献:react-router文档

  1. 安装react-router

    $ npm install --save react-router
    
    
  2. 导入router

    import { Router, Route, Link } from 'react-router';
    import { browserHistory } from 'react-router';
    
    <!--这里创建一个页面about-->
    import About from './about';
    
    class App extends React.Component {
      constructor(props) {
        super(props);
      }
      render() {
        return (
           <div>
             <h1>React-router Demo</h1>
             <ul>
               <li>
                 <Link to="/">首页</Link>
               </li>
               <li>
                 <Link to="/about">关于我们</Link>
               </li>
           </div>
        )
      }
    }
    
    // 不加 history 会报错
    ReactDOM.render(<Router history={browserHistory}>
      <Route path="/" component={App}>
      </Route>
      <Route path="about" component={About}></Route>
    </Router>,
      document.getElementById('app')
    )
    
    

    这样就能够使用Router路由。集成路由还是相当简单的。

  3. over

React 技术栈之打包:webpack

参考文献:webpack搭建项目案例库webpack-demos

  1. webpack

    需要集成webpack、webpack-dev-server、webpack-cli三个组件库

    $ npm install --save webpack webpack-dev-server webpack-cli
    
    
  2. webpack.config.js文件

    这是webpack的配置文件,按照所需配置相关项

    module.exports = {
      entry: './src/index.js',
      output: {
        filename: './bundle/bundle.js'
      },
      module: {
        rules: [
          {
            test: /\.css$/,
            use: [ 'style-loader', 'css-loader' ]
          },
          {
            test: /\.jsx?$/,
            exclude: /node_modules/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015', 'react']
              }
            }
          },
        ]
      }
    };
    
  3. 更新package.json scripts

    将package.json中的scripts选项更改为dev和webpack编译选项

     "dev": "webpack-dev-server --open --history-api-fallback",
     "build": "webpack",
     
     # 执行npm run dev即可编译项目
     $ npm run dev 
     
    
  4. over

React技术栈之Redux

参考:阮一峰Redux简介

  1. 案例

    import React, { Component } from 'react';
    import { createStore } from 'redux';
    
    // 定义reducer
    const reducer = (state, action) => {
      if (typeof state === 'undefined') {
        return 0;
      }
      switch (action.type) {
        case 'INCREMENT':
          return state + "中国";
        case 'DECREMENT':
          return state + "法国";
        case 'CLEAR_NUM':
          return "日本";
        default:
          return state; 
      }
    };
    // 定义store,根据reducer,更改state状态
    const store = createStore(reducer);
    // 定义update state,将新state赋值给DOM节点
    const update = () => {
      const valueEl = document.getElementsByClassName('numValue');
      valueEl[0].innerHTML = store.getState().toString();
    }
    // store订阅update
    store.subscribe(update);
    
    export default class Number extends React.Component {
      addNum() {
        store.dispatch({type: 'INCREMENT'});
      }
      minusNum() {
        store.dispatch({type: 'DECREMENT'});
      }
      clearNum() {
        store.dispatch({type: 'CLEAR_NUM'});
      }
      render() {
        return (
          <div className="wrap">
            <h3>Origin Redux</h3>
            Current Number: <span className="numValue">0</span>
            <div>
              <button className="numBtn" onClick={this.addNum}>+</button>
              <button className="numBtn" onClick={this.minusNum}>-</button>
              <button className="numBtn" onClick={this.clearNum}>clear</button>
            </div>
          </div>
        );
      }
    }
    

    Redux技术 是将state拆分为 state、action、dispatcher、store,结合DOM。一般的我们将这几个事件拆分成文件,类似MVVM架构化。

    redux flow
React技术栈之Flux

Flux总体技术类似Redux

React技术栈之scss 布局
杂记

typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."

对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容