资讯专栏INFORMATION COLUMN

初次入坑 React

张率功 / 997人阅读

摘要:在列表的渲染中不推荐使用循环的下标作为在列表的渲染中,如果对列表某条数据删除会改变其上下的组件的改变增大组件的复用性

React 有关使用包

使用官方提供的react脚手架搭建的小型项目:create-react-app

react中使用路由react-router-dom

单向数据流使用的是redux,通过redux-thunk中间件实现异步操作

使用单向数据流与路由中,通过props逐级传递有点麻烦,性能不佳,使用中间件形式的react-redux构造装饰器,可以访问全局数据流

在react项目中还是用了懒加载react-loadable

import Loadable from "react-loadable"
const Loading = ({      //自定义公用加载时页面
    pastDelay,
    timedOut,
    error
}) => {
    if(pastDelay) {
        return 
; } else if(timedOut) { return
Taking a long time...
; } else if(error) { return
Error!
; } return null; } //路由中页面 懒加载 view const MusicIndex = Loadable({ loader: () => import("./component/MusicIndex/MusicIndex"), loading: Loading, timeout: 10000 })

react中的生命周期
# react 的基本组件生命周期如下
1. constructor 组件的构造函数:接受父组件的参数,初始化state,绑定函数等等的操作
2. componentWillMount 组件渲染之前,每次组件渲染都会触发一次
3. componentDidMount 组件渲染之后,每次组件渲染都会触发一次,子组件都挂载好,可以使用refs,可以使用异步方法,防止阻塞UI
4. componentWillReceiveProps 该函数接收到新的props才会被调用,render不会触发该函数
5. shouldComponentUpdate 在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 
6. componentWillUpdate 该函数接收到新的props或者state与render之前才会被调用,初始化不会触发该函数
7. componentDidUpdate 该函数在组件完成更新后立即调用。在初始化时不会被调用。
8. componentWillUnmount 该函数为组件被移除(卸载)时被调用
class App extends Component {
    constructor(props) {
        super(props)
    }
    componentWillMount(){}
    componentDidMount() {}
    componentWillReceiveProps(newProps) {}
    shouldComponentUpdate(newProps, newState) {
        return true;
    }
    componentWillUpdate(nextProps, nextState) {}
    componentDidUpdate(prevProps, prevState) {}
    componentWillUnmount() {}
    render() {
        return(
            
展示APP页面
); } }
react中使用路由
import { HashRouter as Router, Route, Link } from "react-router-dom"
import { MusicIndex } from "./../MusicIndex.js"
import { MusicRanking } from "./../MusicRanking.js"
import { MusicCollection } from "./../MusicCollection.js"
import { MusicPersonal } from "./../MusicPersonal.js"

render() {
    return(
        
页面一 页面二 页面三 页面四
); }
react中使用单向数据流redux
redux

redux分为3各部分

store :数据,store全局仅有唯一的store

action: 操作,通过触发action改变store的状态,stroe的状态不能不能直接修改

Reducers 执行,通过action反馈的操作去执行,直接修改store的状态

redux 在大型项目中可与 vuex 一样实现模块化管理。redux 通过自带的函数 combineReducers 对自身切割分为多个模块。

redux例子
1. redux分割例子
import { combineReducers } from "redux"
import { albumItem } from "./reducers/MusicAlbumItem"
import { ranking } from "./reducers/MusicRanking"
import { user } from "./reducers/MusicUser"
import { collection } from "./reducers/MusicCollection"

export const rootReducer = combineReducers({
    player,
    ranking,
    user,
    collection
})

2. 多带带分割出来redux的例子
const R_CHANGE = "改变缓存排行版"
const R_INIT = "重置排行版"
const R_LOADING = "排行版列表加在完毕"
//以下为store
let rankingStore = {
    rank:[],
    target:{
        id:0,
        playlist:{}
    },
    loading:true
}
//以下为reducers
export const ranking = (state = rankingStore, action) => {
    switch(action.type) {
        case R_INIT:
            state.rank = action.list
            return Object.assign({}, state)
        case R_CHANGE:
            state.target = action.list
            return Object.assign({}, state)
        case R_LOADING:
            state.loading = false
            return Object.assign({}, state)
        default:
            return state
    }
}
//以下为action
export function r_change(list) {
    return {
        type: R_CHANGE,
        list:list
    }
}
export function r_init(list) {
    return {
        type: R_INIT,
        list:list
    }
}
export function r_loading() {
    return {
        type: R_LOADING
    }
}
redux如何被不同路由下的组件使用与访问

在react的入口文件中注入store,使其可以被全局路由访问

在对应的组件中引入需用的actino,stroe是直接访问全局的,action是按需引入

以下为例子

import React from "react";
import ReactDOM from "react-dom"
import { createStore, applyMiddleware, compose } from "redux"
import { BrowserRouter } from "react-router-dom"
import registerServiceWorker from "./registerServiceWorker"
import "./index.css"
import App from "./App"
import { rootReducer } from "./redux/index"
import thunk from "redux-thunk"
import { Provider } from "react-redux"

const store = createStore(rootReducer, compose(
    applyMiddleware(thunk),
    window.devToolsExtension ? window.devToolsExtension() : f => f
))
//通过路由注入store,使其可被全局访问stroe(前提是需访问的组件引入对应的redux)
ReactDOM.render(
    (
        
            
        
    ),
    document.getElementById("root")
);
react可优化的各方面

在react 16 之前的版本可以通过简单的遍历组件中的props或者state数据的变化监听数据是否被更新,来控制组件的渲染,一个正常的组件在父组件的状态被改变的情况下,会触发render,如果是列表之类的组件render多了就会性能差,可以通过 shouldComponentUpdate 钩子函数来决定组件是否接受更新

在react 16后,官方提出类似Component的接口 PureComponent,react可以自动帮你决定组件是否接受更新

在组件的使用时,必须对其赋于 全局唯一的KEY。在列表的渲染中不推荐使用循环的下标作为 key 在列表的渲染中,如果对列表某条数据删除会改变其上下的组件的 key 改变

增大组件的复用性

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95408.html

相关文章

  • 和我一起入坑-React-Native-加入Redux的TodoList

    摘要:之前写了一篇没有加入的的小博文。一拆分结构根据自己的习惯和固定套路,拆分目录结构和组件结构。把的导航组件集中放在纯粹是个人习惯。二代码实现入口文件是用来做的数据持久化。添加事项后要通知其他组件更新数据。 读前须知 这个项目是第一次使用Redux的实例,并不具有专业性的理论知识。纯粹分享一次开发过程与心得。之前写了一篇没有加入Redux的React Native ToDoList的小博文...

    LucasTwilight 评论0 收藏0
  • react native 入坑集锦

    摘要:使用解构方法操作一个深层的对象,再可能不会触发以及模拟器和真机调试都正常,只有打包发布之后有这个问题。和第一个问题差不多,也是导致实体机有问题有更多坑的同学的可以一起分享交流,后续会持续更新 1. 使用解构方法操作一个深层的对象,再setState,可能不会触发render(ios以及Android模拟器和真机调试都正常,只有打包发布之后Android有这个问题)。 ... /* Re...

    lufficc 评论0 收藏0
  • React-Native 真的是移动开发的未来吗

    摘要:在版本上,安卓系统上的渲染就有锯齿,后来我们不分效果是使用图片实现的,汗啊第三方组件不全。摇一摇问题的解决在我们使用了等状态管理时,热更新不会更新这些代码,而频繁摇一摇实在是太累了。此时可以使用此时相当于虚拟了一个摇一摇事件。 公司本年度有App任务,陆陆续续用RN开发了两个应用。一款是涉及仪器控制的平板项目,另一款是客户端的App。下文谈谈使用RN开发的部分认知(其实只是随便扯一扯,...

    thursday 评论0 收藏0
  • Browserify简易入坑指南

    摘要:简要说明长处在于使用模块规范,而不是使用的模块规范,以及使用的模块规范。简单使用关于命令行工具使用,请参照官方文档。相同模块重复依赖模块重复依赖很容易理解,模块实现时可能分割为多个子文件实现,每个子文件内部可能会引用同一个模块,如。 简介 browerify: http://browserify.org/index.html browserify可以看做浏览器端的又一个模块...

    vpants 评论0 收藏0
  • React打怪升级-角色创建

    摘要:序年,立秋,打算入坑,知道这又是一项艰巨的任务。箭头函数对象解构类拓展运算符升级地图指南学习曲线较为陡峭的需要一个明确的指南,这张来自一个被了的,要好好看一看。开发简书项目从零基础入门到实战接下来,领任务,去升级吧 序 2018年,立秋,打算入坑React,知道这又是一项艰巨的任务。在框架选择时,确实纠结了很长时间,而为什么决定入坑React,是我看到一片文章。也决定把自己的基础知识通...

    Noodles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<