react学习之路

197 阅读6分钟

react学习之路

  最近刚学习了react,发现与vue有许多不一样的地方,记录下一些自己的学习心得,
  希望对刚刚入门react的小白有一些帮助。

1搭建项目


先开始在桌面上建立一个文件夹,名字随意,我用react命名。

开始安装依赖,执行

**
    npm install -g create-react-app
    
    create-react-app demos
    
    cd demos 
    
    npm run start
    
**

这时候你已经有了一个react的项目了,但是却还没有完善起来。 你可能需要会需要修改一下项目本身的一些配置。

**
    npm run reject //反编译代码,将webpack配置暴露出来
    
    /*
        新一点的版本会执行不了,他会提示你需要建立一个git版本才能执行.
        好了,我们开始建立git版本
        
        git init 
        
        git add . 
        
        git commit -m 'init'
        
        npm run reject
    */
**

这时候你会得到config文件夹和script文件夹。我本人需要的功能配置比较少,如果这里没有的配置可以自行百度解决。

**  
//webpack.config.js
webpack基础配置都在这里。

module: {
    rules: {
        //add code 
        //配置less
        {
          test: /\.(less)$/,
          exclude: /\.module\.(less)$/,
          use: getStyleLoaders({ importLoaders: 3 }, 'less-loader'),  
        },
        
    }
}

//添加路劲别名

resolve: {
    alias: {
        //add code
        '@': path.resolve('src'),
    }
}

**

这时候已经有两个东西了, 你可以使用less去写你的css,当然你也可以配置你喜欢的插件,新的语法什么的去构建,还有得到一个简便化的路劲‘@’对象。接着我们来对自己的项目进行规划,你的每个资源应该放在那里。 我一般项目目录都是如下:

**
    -demos
        --config
        --public
        --react
        --script
        --src
            //静态资源
            --assets 
                --images
            //组件资源
            --conponents
                --Swiper
                    Swiper.js
                    Swiper.less
            //页面
            --pages
                --Home
                    Home.js
                    Home.less
            //状态管理
            --redux
            //路由管理
            --router
                index.js
            //请求服务管理
            --server
                index.js
            //工具
            --utils
            APP.JS
            APP.less
            index.js
            index.less
        packge.json
**

2.开始编写页面


第一我们先将入口文件写好

**
    //App.js
    import React, { Component } from 'react';
    import './App.less';
    import RouteConfig from '@/router/index';
    
    class App extends Component {
      render() {
        return (
            <div className="bodyContainer">
              <RouteConfig />
            </div>
        );
      }
    }
    
    export default App;
**

第二 我们需要开始写路由RouteConfig

**
    //下载依赖
    npm install --save react-router-dom
    
    // /router/index.js
    
    import React, { Component } from 'react';
    import { HashRouter, Switch, Route } from 'react-router-dom';
    
    //引入页面
    import Home from '@/pages/Home/index';
    import User from '@/pages/User/user';
    import Exhibition from '@/pages/Exhibition/exhibition';
    
    export default class RouteConfig extends Component {
        render() {
            return (
                //使用hash模式
                <HashRouter>
                    //保证匹配一个
                    <Switch>
                        //exact 验证完全匹配
                    	<Route exact  path="/" component={Home} />
                    	<Route path="/user" component={User} />
                        //带参数路径
                        <Route path="/exhibition/:id" component={Exhibition} />
                    </Switch>
                </HashRouter>
            )
        }
    }
    
**

这个路由组件是我临时写的,你可以更加的细化它,给他建立路由表,然后通过路由对象去渲染路由组件。

路由需要注意的点是:

  1. 当你path为 ‘/’ 和 ‘/user’的时候,你跳转‘/user’的时候它不会渲染User组件,为什么呢?

因为当路由匹配到 ‘/’的时候路由对象会输出第一个匹配的对象,所有你需要在路由对象上加上 exact 属性。 完全匹配。

2.当你带参数过去的时候,有很多种方法,可惜都会在页面刷新的时候会重置,这样你页面就会报错

带参数过去的方法有以下几种:

**
    'query'方式:
    
     <Route path="/exhibition" component={Exhibition} />
     
     <Link to={{ pathname="exhibition", query={id: 0}  }} />
     
     页面刷新会消失,因为存在react对象下,页面重新render的时候会重置对象。
    
    'state'方式:
    
     <Route path="/exhibition" component={Exhibition} />
     
     <Link to={{ pathname="exhibition", state={id: 0}  }} />
     
     页面刷新会消失,因为存在react对象下,页面重新render的时候会重置对象。
    
    '/:id'方式
    
    <Route path="/exhibition/:id" component={Exhibition} />
     
     <Link to={"/exhibition" + 0} />
     
     页面刷新不会消失,因为地址上会显示值,react对象会通过地址获取到值

**

有了路由对象,这样我们就可以切换页面,可以进行页面的编写了。

**
//Home.js

//引入react对象
import React, {Component} from 'react';
//react对象类型判断
import PropTypes from 'prop-types';
//路由对象跳转组件
import { NavLink } from 'react-router-dom';	

//创建一个home类 继承Compoent对象
class Home extends Component {
    
    //子类的方法
    constructor(props) {
        //继承this 和props
        super(props);
        this.state = {
            id: 0,
        }
    }
    
    
    //对象私立方法 以_开头
    _changeName() {
        console.log(this.props.name)
    }
        
    
    //输出函数
    render() {
        //在这里可以在输出前拿到home对象底下的 state, 方法,props;
        
        var { id }  = this.state;
        
        var { name } = this.props;
        
        var _changeName = this._changeName;
    
        //输出你要展示的内容
        return (
            <div>
                123
            </div>
        )
    }
}

**

react的文档可以访问 react.docschina.org

如果你学习过mvvm框架,理解起来就不难,vue会将模板,数据,样式分成3个部分,react只有2个部分 类和样式。

1.新建一个类

class Home extends Component {}

这里会继承Component对象的方法和属性。

2.创建私有属性和方法

constructor(props) { //继承this 和props super(props); this.state = { id: 0, } }

_changeName() { console.log(this.props.name) }

私有属性放在constructor 里面,私有方法放在home类里面.state可以相当于vue的vue数据对象。

3.输出模板

render() {

return (
    <div>hello {this.state.name} {{{ <div>123</div> }}} </div>
)

}

render是一个输出函数,放入已经拼接好数据的模板。所有内容放入一个父容器里面, 默认里面为字符串输出, 如果要放变量或者表达式 用 {} 包裹。如果要解析html代码用 {{{ }}}包裹。

**

**

当你已经会写react对象时,你就需要了解react的生命周期

初始化Props,PropTypes, 实例化类 -> 组件挂载之前(componentWillMount())=> 开始挂载 => 组件挂载之后(componentDidMount) => 组件运行=> 组件更新或者props更新 => 组件是否需要更新=> 组件更新之前(compentWillUpdate)=> 组件刷新 => 组件刷新之后(componentDidUpdate) => 组件运行 => 组件卸载(componentWillUmount)()

需要注意的是当你props改变 或者state改变的时候都会触发组件刷新。


3. react知识点


1.组件更新状态是异步的,所以有时候会造成你数据更新了但是视图并不会更新

**
    //触发状态更新 但是是异步操作 视图不会更新
    
    a() {
        this.setState({
            name: 2
        })
    }
    
    this.setState({
        name: 1
    })
    
    a();
    
    得到的name = 1
    
    //setState第二个参数是回调  会在状态更新后执行
    a() {
        this.setState({
            name: 2
        })
    }
    
    this.setState({
        name: 1
    }, () => this.a )
    
    得到的name = 2
    
**

2输出html数据

**
    // 此属性是react 防止跨站点脚本(XSS)攻击
    // dangerouslySetInnerHTML  设置html 并使用__html键传递对象

    <div dangerouslySetInnerHTML= {{ __html: this.state.content }}></div>
**

4.请求数据


请求数据我用的事axios, 喜欢用fetch的其实都差不多

**
    import axios from 'axios'
    import config from './config'
    import qs from 'qs'
    
    const service = axios.create(config)
    
    // POST 传参序列化
    service.interceptors.request.use(
      config => {
        if (config.method === 'post') {
          config.data = qs.stringify(config.params)
          config.headers={
             'Content-Type': 'application/x-www-form-urlencoded'
          }
        }
        //console.log(config)
        
    
        return config
      },
      error => {
        return Promise.reject(error)
      }
    )
    // 返回状态判断
    service.interceptors.response.use(
      res => {
        //console.log('ceres', res)
       
        
        return res.data
      },
      error => {
        return Promise.reject(error)
      }
    )
    
    export default {
      post (url, data) {
        //console.log('post request url', url)
        return service({
          method: 'post',
          url,
          params: data
        })
      },
      get (url, data) {
        //  console.log('get request url', url)
        return service({
          method: 'get',
          url: url,
          params: data
        })
      }
    }
    
**

路由,页面,数据都可以的时候,这时候页面最基础的元素就都有了。你就可以开始写你自己的项目。今天暂时就写这么些,以后再慢慢更新,如果有什么没有写上去的可以在下方评论告诉我。