react知识要点

React:

一.主要终端操作

1. 下脚手架:create-react-app 项目名

2. 起服务:npm start

3. 下包:

npm i axios mockjs node-sass redux redux-logger redux-thunk react-redux react-router-dom -D

      (ajax) (数据模拟)(scss)(  redux   )(    路由    )

二.清空脚手架

1. src文件夹删除App.test.js  index.css  logo.svg  serviceWorker.js  setupTests.js 文件

2. index.js文件删除以下代码

(1)import './index.css';----3

(2)import * as serviceWorker from './serviceWorker';-----5

(3)serviceWorker.unregister()-----12

3.App.css清空,准备写入新的样式代码

4.App.js文件删除

import logo from './logo.svg';

&&

<header className="App-header">

        <img src={logo} className="App-logo" alt="logo" />

        <p>

          Edit <code>src/App.js</code> and save to reload.

        </p>

        <a

          className="App-link"

          href="https://reactjs.org"

          target="_blank"

          rel="noopener noreferrer"

        >

          Learn React

        </a>

      </header>

三.配路由

1. src文件夹下建立views文件夹,用来配置路由文件

文件格式例

如:

2. 文件格式为.js文件,内容生成快捷方式 rcc  (路由文件名首字母大写)

import React, { Component } from 'react'

export default class “文件名” extends Component {

  render() {

    return (

      <div>


      </div>

    )

  }

}

3. 在src文件夹中建route文件夹,放置router-config.js  RouterViews.js 两个文件

4. router-config.js  文件中写路由文件的关系

import Home from "../views/home/Home";  ==>引路由文件

import Detail from "../views/Detail";

import Eat from "../views/home/eat/Eat"

import Pay from "../views/home/pay/Pay";

const routes =[    ===>配置路由

    {

        path:"/home",

        component:Home,

        children:[

            {

                path:"/home/eat",

                component:Eat

            },{

                path:"/home/pay",

                component:Pay

            },{

                path:"/home",

                redirect:"/home/pay"  ===>重定向

            }

        ]

    }{

        path:"/detail/:id",  ===>跳详情需要传入id

        component:Detail,

    },{

        path:"/",

        redirect:"/home"    ===>重定向

    }

]

export default routes    ====>抛出

5. RouterViews.js  文件中具体配置路由操作(固定)

import React, { Component } from 'react'

import { Route,Switch,Redirect } from "react-router-dom"

export default class RouterViews extends Component {

  render() {

    let routes = this.props.routes.filter(v=>v.component)

    let redirect = this.props.routes.filter(v=>v.redirect)

      return (

        <Switch>

          {

            routes.map((item,index)=>{

            return <Route key={index} path={item.path} render={

              props=>{

                if(item.children){

                  <item.component routes={item.children} {...props}/>

                }

                return <item.component {...props} />

              }

              }></Route>

            })

            }

      {

      redirect.map((item,index)=>{

      return <Redirect key={index} from={item.path} to={item.redirect} />

      })

      }

      </Switch>

  )

}

}

6. App.js  文件

import RouteViews from "./route/RouterViews"

import routes from "./route/router-config"

import { BrowserRouter } from "react-router-dom"

function App() {

  return (

    <BrowserRouter>

        <div className="App">

          <RouteViews routes={routes} ></RouteViews>  //视图

        </div>

    </BrowserRouter>

  );

}

7. 需要配置路由的页面

import RouteViews from "../../route/RouterViews"

import { NavLink } from "react-router-dom"

(1)导航栏

<NavLink to="/home/pay">路由1</NavLink> //==>to后边写的是路由路径

<NavLink to="/home/eat">路由2</NavLink> //添加点击效果  .active{}

(2)视图

<RouteViews routes={this.props.routes}></RouteViews>

  注:简单路由配置

    1.App.js

import { BrowserRouter, Switch, Redirect, Route } from 'react-router-dom';

import Home from '../view/home'

<BrowserRouter>

        <div className="app">

            <Switch>//视图

                <Route path="/home" component={Home}></Route>

                <Redirect to="/home"></Redirect>

            </Switch>

        </div>

</BrowserRouter>

  2.导航栏

import { NavLink } from 'react-router-dom';

<NavLink path="/home">主页</NavLink>

四.简单样式(scss)

1. 三段式

.index{

  width:100%;

  height:100%;

  display:flex;

  flex-direction:column;

  header{

width:100%;

height:50px;

}

  main{

flex:1;

width:100%;

overflow:true

}

  footer{

width:100%;

height:50px;

}

  }

2. 吸顶

position:sticky;

left:0;

top:0;  ==>需要吸顶的部分距离顶部位置的负值

3. 横滚

overflow-x: scroll; ==>横向加滚动条

五.数据的模拟与引入

1.src文件夹创建mock文件夹index.js文件

import Mock from 'mockjs'

const data = Mock.mock({

    "list|10":[    //10条数据

        {

            "id|+1":0,  //id从0开始每个+1

            "name":"@ctitle(8)",  //8个随机汉字

            "img":"@image(80x80,@color())",  //80px*80px的随机色块

            "title":"@ctitle(20)", //20个随机汉字

            "zan|100-200":110,  // 100-200的随机数

        }                          //cname:随机中文名

    ] //具体看官网

})

Mock.mock('/list',function(){

    return data.list

})

2.App.js文件中引用

import "./mock/index"

3.在文件中用axios获取数据

(1)import axios from "axios" //调用插件

(2)state = {

        list:[],

}

(3)componentDidMount() {

        axios.get("/list").then(res => {

          let list = this.props.list

          this.setState({

              list

          })

      })   

    }

4. 使用  this.state.list

六.事件及操作

1. 所有的标签用虚拟dom写在render(){ return(......)}内,并且最外层有一个大盒子包裹,里边所有带js操作的标签都要用{}包裹。

2. 渲染:

this.state.list.map((item,index)=>{

return (<div key={index}>

<p>{item.title}</p>

<img src={item.img} />

</div>)

      )}

3. 点击事件

<button className="active" onClick={()=>{

              this.to(id)

        }}>

to=(id)=>{


    }

七.组件

    新建components文件夹内创建组件

引用:import Car from './components/car'

使用:<Car />

八.跳详情

1.<dt onClick={() => {

                this.jump(item.id)

          }}>

2. jump = (id) => {

        this.props.history.push("/detail/" + id)

    }

3.在detail.js文件中

state={

        list:[]  //数据

    }

componentDidMount(){

        axios.get("/list").then(res=>{

            let id = this.props.match.params.id;//传过来的id

            let list = res.data.filter(v=>v.id==id)[0]

            this.setState({

                list

            })

        })

    }

九.redux

1. 下包 redux,react-redux, redux-logger, redux-thunk

2. App.js文件中

import { Provider } from "react-redux"

import store from "./store/index"

function App() {

  return (

    <BrowserRouter>

      <Provider store={store}>  //redux主要添加这行代码

        <div className="App">

          <RouteViews routes={routes} ></RouteViews>

        </div>

      </Provider>

    </BrowserRouter>

  );

}

3. 在src文件夹中创建store文件夹及index.js文件

import { createStore, applyMiddleware } from "redux";

import logger from "redux-logger";

import thunk from "redux-thunk";

let initState = {

List:[]

    //主要写在redux中保存的数据

}

function reducer(state = initState, action) {

    state = JSON.parse(JSON.stringify(state))

    switch (action.type) {

        case 'GET_DATA': //大写的方法名

            state.list = action.list  //传过来的数据处理后保存到state里

            return state

        default:

            return state;

    }

}

const store = createStore(reducer, applyMiddleware(thunk, logger))

export default store

4. 需要redux操作的文件

(1)import { connect } from 'react-redux'

(2)删除自动生成的export default

(3)

let state = state => {

    return {

        list: state.list,  //获取redux的list数据

    }

}

let dispatch = dispatch => {

    return {

        getData(list) {

        dispatch({ type: "GET_DATA", list }) //传list用GET_DATA方法

        }

    }

}

export default connect(state, dispatch)(“文件名”)

(4)存: this.props.getData(data) //用getData方法传data数据给redux

(5)取: this.props.list  //取redux内的数据

十.点击返回

this.props.history.go(-1)

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