美文网首页机器学习&全栈我爱编程
RN精进笔记(十一)React框架精读

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

作者: 采香行处蹙连钱 | 来源:发表于2018-06-01 11:25 被阅读107次

    [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的局限性。

    相关文章

      网友评论

      本文标题:RN精进笔记(十一)React框架精读

      本文链接:https://www.haomeiwen.com/subject/yxihsftx.html