注意事项(报错)

npm install -g cnpm --registry=https://registry.npm.taobao.org
'react-scripts' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

    // 有时在安装完其他组件后,再次运行 npm start 命令时会报以上错误,
    ## 解决方案1:
    npm install react-scripts
    安装完成后再次运行 npm start 即可
    ## 解决方案2:
    删除modules 文件
    npm install
    安装完成后再次运行 npm start 即可

安装的单词缩写

==> i = install (安装)
> -g = global (全局)

> -S = --save (发布到开发环境)

> -D = --save-dev (发布到生产环境)

引入了三个库文件

react.min.js - React 的核心库
react-dom.min.js - 提供与 DOM 相关的功能
babel.min.js - Babel 可以将 ES6 代码转为 ES5 代码,这样我们就能在目前不支持 ES6 浏览器上执行 React 代码。Babel 内嵌了对 JSX 的支持。通过将 Babel 和 babel-sublime 包(package)一同使用可以让源码的语法渲染上升到一个全新的水平。

安装公共仓库

###### npm i redux -S

创建 store -> index.js  reducer.js  actionCreators.js  actionTypes.js

// index.js (调试工具>安装 REDUX_DEVTOOLS)

import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());
export default store;

// actionTypes.js  
export const CHANGE_INPUT_VALUE = 'change-inpue-value';

// actionCreators.js      
import { CHANGE_INPUT_VALUE } from './actionTypes';
export const getInputChangeAction = (value) => ({
    type: CHANGE_INPUT_VALUE,
    value
});

//  reducer.js
import { CHANGE_INPUT_VALUE } from './actionTypes';
const defaultState = {
    inputValue: '222',
    list: ['ewewee','ewewe']
};
export default (state = defaultState, action) => {
    if (action.type === CHANGE_INPUT_VALUE) {
        const NewState = JSON.parse(JSON.stringify(state));
        NewState.inputValue = action.value;
        return NewState;
    }
    return state;
}


// 组件调用

import store from './store/index'
import { getInputChangeAction } from './store/actionCreators';

constructor(props) {
    super(props);
    console.log(store.getState())
    this.state = {

    }
    this.chageget = this.chageget.bind(this)
    store.subscribe(this.chageget) // 数据改变是更新
}

chageget() {
    console.log(store.getState())
}

// 获取数据

store.getState()

 // 添加数据

handleInputValue(event) {
<!--const action = {-->
<!--  type: 'change_input_value',-->
<!--  value: event.target.value-->
<!--}-->
const action = getInputChangeAction(event.target.value);
store.dispatch(action);
};

缓存

数据放入缓存
localStorage.setItem('user',values.username);

缓存中取数据
localStorage.getItem('user');
插件

npm i react-redux -S

中间件

npm i redux-thunk -S

// index.js (调试工具>安装 REDUX_DEVTOOLS)
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import reducer from './reducer';

const composeEnhancers =  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;
const enhancer = composeEnhancers(
    applyMiddleware(thunk),
)
const store = createStore(reducer,enhancer);
export default store;

// actionCreators.js
import { CHANGE_INPUT_VALUE } from './actionTypes';
import axios from 'axios';  
export const getInputChangeAction = (value) => ({
type: CHANGE_INPUT_VALUE,
value
});
export const getList = () => {
return (dispatch) => {
    axios.get(url ,{page: 1, limit: 10, token:token}).then((res)=>{
        const data = res.data.data.list;
        const action = getInputChangeAction(data);
        dispatch(action);
    })
}
}

 // 组件调用
import store from './store/index';
import { getInputChangeAction, getList } from './store/actionCreators';

getList() {
const action = getList();
store.dispatch(action);
}


npm i redux-sage -S
安装路由 react-router-dom

npm i react-router-dom -S

// index.js 入口文件
import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';   // 框架样式
import './index.css';       // 自定义样式
import Index from './view/common/index';  // 首页的路径
import { BrowserRouter } from 'react-router-dom'; // 路由文件
// HashRouter 和 BrowserRouter 都能实现跳转  HashRouter 前多个 #

ReactDOM.render(
    // 必须要包住路径才能实现跳转
    <BrowserRouter> 
        <Index />
    </BrowserRouter>
, document.getElementById('root'));


// 新建 router ->index.js
import React from 'react';
import {Switch, Route, Redirect} from 'react-router-dom';
import Index from '../view/index/index';

export default class Routers extends React.Component{
    render() {
        return(
            <Switch>
                <Route path="/" exact render={()=>(<Redirect to="/index" />)}/>
                <Route path="/index" component={Index}/>
            </Switch>
        )
    }
}

方法跳转:

this.props.history.push('/download')
跳转到外链:

window.location.href = 'https://你的url'
数据获取 axios
npm i axios  -S

在package.json中
  "proxy": "http://service.n.co"


import React from 'react';
import { Table } from 'antd'; // antd UL
import axios from 'axios';  

export default class User extends React.Component{
  constructor(props){
    super(props)
    this.state={
      data: []

    }
  };
    componentWillReceiveProps(){
        this.getData();
    }
    getData(){
      let that = this;
      axios.get('/backend/account/index',{page: 1, limit: 10, token:token})
      .then((res)=>{
          that.setState({data:res.data.data.list})
      })
      .catch((error)=>{
      });
    };

    render() {
        return(
            <Table dataSource={this.state.data} rowKey="id" />
        )
    }
}

antd ul 安装

npm i antd  -S

https://ant.design/docs/react/use-with-create-react-app-cn

安装:开发环境

修改配置环境,以适应antd(官网参考)
npm i react-app-rewired -D

npm i babel-plugin-import -D  // 按需加载

语法:

//站位符可以替代最外围标签

    <Fragment>

//构造函数

    constructor(props) {
    super(props); //调用方法
    this.state = { // 组件状态
        }
    }

// 展开运算符

    this.setState({
                list: [...this.state.list, this.state.inputVal ],
                inputVal: ''
            })

// immutable
// state 不予许我们做任何改变

// 转意
dangerouslySetInnerHTML={{__html: item }}

//  lable 标签

    <label htmlFor="inp">输入类容</label>
                <input id="inp" className="input" value={this.state.inputVal} onChange={this.changInput.bind(this)} />
                <button onClick={this.btnClick.bind(this)}>提交</button>

代码优化

// 绑定事件
this.btnClick = this.btnClick.bind(this);

// 循环渲染封装方法

getList() {
    return this.state.list.map((item, index) => {
        return (
            <List 
                key={index}
                content={item}  // 向子组件传值
                index={index}
                del={this.del}// 向子组件传方法
            />
        )
    })
}
// 子组件调用
render() {
    const { content } = this.props;
    return(
        <div onClick={this.leClick}>
            {content}
        </div>
    )
}

leClick() {
    const { del, index } = this.props;
    del(index);
}

// es6改变状态值方法

this.setState((prevState) => ({
        list: [...prevState.list, prevState.inputVal ],
        inputVal: ''
    }));

    del(index) {
    this.setState((prevState) => {
        let list = [...prevState.list];
        list.splice(index, 1);
        return {list}
    });
}

// 传值类型

npm install --save prop-types
    import PropTypes from 'prop-types';
    List.propTypes = {
        test: PropTypes.string.isRequired, //必须传
        test: PropTypes.arrayOf(PropTypes.string, PropTypes.number), // 或者
        content: PropTypes.string,
        del: PropTypes.func,
        index: PropTypes.number
    }
    // 默认值
    List.defaultProps = {
    test: 'hello'
}

调试工具

Reactdevelopertools  REDUX_DEVTOOLS
安装及使用

谷歌浏览器 => 更多工具 => 扩展程序 => 打开谷歌应用商店 => 搜索 react => 安装
=> 浏览器中打开开发者工具 => react

tiryLi