React从插槽、路由、redux的详细过程

目录
  • 1. React 插槽
  • 2. React 路由
    • 2.1 安装库
    • 2.2 ReactRouter三大组件
    • 2.3 路由其他方法
    • 2.4 重定向组件
    • 2.5 Switch组件
    • 2.6 示例
  • 3. redux
    • 3.1 主要作用
    • 3.2 使用步骤
  • 4. react-redux
    • 4.1 基本概念

内容

清楚React 插槽
弄明白React 路由
会使用 redux 及 react-redux

1. React 插槽

组建中写入内容,这些内容可以被识别和控制。React需要自己开发支持插槽功能。原理:父组件组件中写入的HTML,可以传入子组件的props中。

1.组件中的HTML内容直接全部插入

2.组件中根据HTML内容的不同,插入的位置不同

示例:

class AppCom extends React.Component{
    constructor(props){
        super(props);
        this.state = {}
    }
    render(){
        return(
            <div>
                <h1>我是App根组件</h1>
                <h1>-----------------</h1>
                <SlotCom>
                <h3>我是插槽内的文字1</h3>
                <h3>我是插槽内的文字2</h3>
                <h3>我是插槽内的文字3</h3>
                </SlotCom>
                <h1>------------------</h1>
                <SlotChangeCom>
                    <h2 className="header">Header</h2>
                    <h2 className="main">Main</h2>
                    <h2 className="footer">Footer</h2>
                </SlotChangeCom>
            </div>
        )
    }
}

class SlotCom extends React.Component{  //组件中HTML内容直接全部插入
    render(){
        console.log(this.props)
        return(
            <div>
                {this.props.children}
            </div>
        )
    }
}

class SlotChangeCom extends React.Component{    //组件中HTML内容不同,插入位置不同(注意此处的值也可自定义,均可早props中拿到)
    render(){
        console.log(this.props)
        let HeaderCom,MainCom,FooterCom;
        this.props.children.forEach((item,index)=>{
            if(item.props['className'] === 'header'){
                HeaderCom = item
            }else if(item.props['className'] === 'main'){
                MainCom = item
            }else{
                FooterCom = item
            }
        })

        return(
            <div>
                <div>
                    {HeaderCom}
                </div>
                <div>
                    {MainCom}
                </div>
                <div>
                    {FooterCom}
                </div>
            </div>
        )
    }
}

2. React 路由

根据不同的路径,显示不同的组件(内容);React使用的库react-router-dom;

2.1 安装库

npm install react-router-dom --save

2.2 ReactRouter三大组件

  • Router:所有路由组件的根组件(底层组件),包裹路由规则的最外层容器
  • 属性:basename->设置当前路由根路径,router可以在1个组件中写多个。
  • Link路由跳转的组件,主要配合 to 实现路由跳转。
  • Route:路由规则匹配组件,显示当前规则对应的组件。

2.3 路由其他方法

  • 如果要精确匹配,那么可以在route上设置exact属性
  • Link组件可以设置to属性来进行页面的跳转,to属性可以直接写路径的字符串,也可以通过1个对象,进行路径的设置。
  • Linkreplace属性:点击链接后,将新地址替换成历史访问记录的原地址

2.4 重定向组件

如果访问某个组件时,如果有重定向组件,那么就会修改页面路径,使得页面内容显示为所定向路径的内容

<Redirect><Redirect>

2.5 Switch组件

让switch组件内容的route只匹配1个,只要匹配到了,剩余的路由规则将不再匹配

注意:Switch 组件只能包裹在 Route组件外面

2.6 示例

1.效果

2.代码

import React from 'react';
import './index.css';
// import {HashRouter as Router,Link,Route} from 'react-router-dom';//哈希模式
import {BrowserRouter as Router,Link,Route,Redirect,Switch} from 'react-router-dom';//history模式

function One(){ //定义单个组件做演示
    return(
        <h1>我是ONE</h1>
    )
}
function Two(){
    return(
        <h1>我是TWO</h1>
    )
}
function Three(props){
    console.log(props)  //接收传递的参数
    return(
        <h1>我是THREE</h1>
    )
}
function News(props){
    console.log(props.match.params.id)//拿到动态路由传递的参数
    return(
        <h1>我是动态路由页</h1>
    )
}
function GoTwo(){
    return(
        <Redirect to="/two"></Redirect>
    )
}

class RouterCom extends React.Component{
    constructor(props){
        super(props)
        this.state = {

        }
    }
    render(){
        let threeObj = {
            pathname:'/three', //传入的路径
            search:'?id=1',//get请求参数
            hash:'#three',//设置Hash值
            state:{msg:'hello world'} // 传入组件的数据
        }
        return(
            <div>
                <Router>{/*  Router 含有basename属性,表示基础路径 自动加上basename 的值;用其可进行嵌套子路由 */}
                    <div className="tab">
                        <Link to="/one">ONE</Link>
                        <Link to="/two">TWO</Link>
                        <Link to={threeObj} replace>THREE</Link>
                        <Link to="/news/2">NEWS</Link>
                        <Link to="/gotwo">goTwo</Link>
                    </div>
                    <Switch>
                    <Route path="/one" exact component={One}></Route>
                    <Route path="/one" exact component={One}></Route>
                    <Route path="/two" exact component={Two}></Route>
                    <Route path="/three" exact component={Three}></Route>
                    <Route path="/news/:id" exact component={News}></Route>
                    <Route path="/gotwo" exact component={GoTwo}></Route>
                    </Switch>
                </Router>
            </div>
        )
    }
}

export default RouterCom

3. redux

解决React数据管理(状态管理),用于中大型,数据比较庞大,组件之间数据交互多的情况下使用。如果你不知道是否需要使用Redux,那么你就不需要用它!

3.1 主要作用

  • 解决组件的数据通信
  • 解决数据和交互较多的应用

Redux只是一种状态管理的解决方案!

Store:数据仓库,保存数据的地方
State:state:是1个对象,数据仓库里的所有数据都放到1个state里
Action:1个动作触发数据改变的方法
Dispatch将动作触发成方法
Reducer:是1个函数,通过获取动作,改变数据,生成1个新state。从而改变页面。

3.2 使用步骤

  • 安装 reduxnpm install redux
  • 创建 reducer 函数
  • 创建仓库修改数据(通过动作修改数据)
  • 获取数据
  • 修改视图(监听数据的变化,重新渲染内容)

示例:

预览:

代码:

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';

class ComputerCom extends React.Component{ // 创建需要展示数据的组件
    render(){
        let state = store.getState(); // 通过getState() 方法获取 Store 里的值
        return(
            <div>
                <h1>Store里边的数:{state.num}</h1>
                <button onClick={add}>自加 1</button>
                <button onClick={subtraction}>自减 1</button>
            </div>
        )
    }
}

function reducer(state={num:0},action){  //Reducer:是1个函数(初始化数据),通过获取动作,改变数据,生成1个新state。从而改变页面
    switch(action.type){
        case "add":
            state.num++
            break;
        case "subtraction":
            state.num--;
            break;
        default:
            break;
    }
    return {...state}  // 此处返回相当于 对象的 copy
}

const store = createStore(reducer); //创建仓库(必须传入reducer)

//定义要操作的方法
function add(){
    store.dispatch({type:"add"})  //通过仓库的方法dispatch进行修改数据
    // store.dispatch({type:"add",content:{id:1,msg:"helloworld"}})  也可在修改数据时传入参数
}

function subtraction(){
    store.dispatch({type:"subtraction"})  //通过仓库的方法dispatch进行修改数据
}

ReactDOM.render(<ComputerCom></ComputerCom>,document.querySelector("#root"))

// 通过store.subsctibe() 方法(必须传入函数) 修改视图(监听数据的变化,重新渲染内容)
store.subscribe(()=>{
    ReactDOM.render(<ComputerCom></ComputerCom>,document.querySelector("#root"))
})

注意:所有的数据操作均在 reducer 中完成,其他函数不可修改数据,只能 将动作触发成方法

4. react-redux

react-redux 是对redux 的进一步完善,它避免了redux 每次修改数据都要调用渲染函数的弊端

4.1 基本概念

安装:npm install react-redux 注意,使用时还要安装 redux

Provider组件自动的将store里的state和组件进行关联
MapStatetoProps:这个函数用于将store的state映射到组件的props里,实现数据共享。(函数名自定义)
mapdispatchToProps将store中的dispatch映射到组件的props里,实现了方法的共享。(函数名自定义)
Connect方法:将组件和数据(方法)进行连接

示例(执行结果与redux 演示同):

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';
import {connect,Provider} from 'react-redux';

class ComputedCom extends React.Component{
    render(){
        // 仓库的数据,通过store 的state 传给props ,直接通过props 就可以获取 state的数据
        const value = this.props.value;
        // 将修改数据的方法传入到props中(等同于vuex 的 mapMutation 映射)
        const clickAdd = this.props.clickAdd;
        const clickSub = this.props.clickSub;
        return(
            <div>
                <h1>Store里面的数:{value}</h1>
                <button onClick={clickAdd}>自加1</button>
                <button onClick={clickSub}>自减1</button>
            </div>
        )
    }
}
let actionObj = {
    add:function(state,action){
        state.num++;
        return state
    },
    sub:function(state,action){
        state.num = state.num + action.num; // action.num 接收传递的参数
        return state
    }
}
function reducer(state={num:0},action){  // # Reducer:是1个函数(初始化数据),通过获取动作,改变数据,生成1个新state。从而改变页面
    // 如果方法过多,可以把它写在外面
   /*  switch(action.type){
        case "add":
            state.num++
            break;
        case "sub":
            state.num--;
            break;
        default:
            break;
    } */
    if(action.type.indexOf('redux') === -1){    //判断数据是否初始化,若无初始化,先初始化
        state = actionObj[action.type](state,action);
        return {...state} //# 状态结构,防止哈希值相同,不进行解析
    }else{
        return state
    }
}

const store = createStore(reducer);  // 创建仓库

function mapStateToProps(state){  //# 将数据映射到props(映射函数的形参固定)
    return{
        value:state.num
    }
}
// 将修改state 数据的方法,映射到props,默认会将 store.dispatch() 作为参数
function mapDispatchToProps(dispatch){
    return{
        clickAdd:()=>{dispatch({type:"add"})},
        clickSub:()=>{dispatch({type:"sub",num:-1})}  //向action 传值
    }
}
// 将数据仓库的state 和 修改state 的方法映射到新的组件上,形成新的组件(让数据、方法、组件形成关联)
const App = connect(
    mapStateToProps, //# 切记数据映射要写在方法映射之前(否则无法拿到数据)
    mapDispatchToProps,
)(ComputedCom)

ReactDOM.render(
    <Provider store={store}>
        <App/>
    </Provider>,
    document.querySelector('#root')
)

注意:①:返回状态数据时要解构:防止哈希值相同,不进行解析;②:将数据映射到props(映射函数的形参固定,函数名可自定义);③:切记用 connect 建立连接时:数据映射要写在方法映射之前(否则无法拿到数据)。

加油

到此这篇关于React从插槽、路由、redux的详细过程的文章就介绍到这了,更多相关React插槽路由内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 简易的redux createStore手写实现示例

    目录 1.首先创建一个store 2.其次创建一个my-redux 书写getState()方法 书写dispatch方法 书写subscribe方法 特别注意: 3.创建一个Test组件进行检测. 1. 将Test组件记得引入App根组件 2. 将store引入Test组件 3. 创建一个类组件,并且使用store.getState()获得状态值 4. 书写对应的点击按钮 1.首先创建一个store 沙箱链接 根目录创建一个store文件夹,下面创建一个index.js import { cr

  • useReducer createContext代替Redux原理示例解析

    目录 前言 采用react-redux实现 采用react hooks模拟redux实现 异步action 总结 前言 最近看到很多采用useReducer + createContext 实现一个简易的redux的方案,今天亲自试了一下,发现还是会有一些区别的. 采用react-redux实现 这里使用react-redux 实现一个简单的状态管理例子. App.jsx根组件 import React from 'react'; import { Button } from './Button

  • React immer与Redux Toolkit使用教程详解

    目录 1. immer 1.1 setState结合immer使用 1.2 useState结合immer使用 1.3 immer和redux集合 2. Redux Toolkit 1. immer 概述: 它和immutable相似的,实现了操作对象的数据共享,可以优化性能.它实现的原理使用es6的Proxy完成的.小巧,没有像immutable哪样有新数据类型,而是使用js类型. 安装: yarn add immer@9 1.1 setState结合immer使用 简单使用: import

  • 在 React 中使用 Redux 解决的问题小结

    目录 在 React 中使用 Redux 解决的问题 在 React 项目中加入 Redux 的好处 React + Redux 安装 Redux React 中 Redux 的工作流程 React 计数器案例 使用 Redux Provide 组件 connect 方法 使用 bindActionCreators 方法继续简化 代码重构 为 Action 传递参数 Redux 弹出框 初始化静态内容 添加默认隐藏状态 定义操作按钮 衍生的问题 拆分合并 reducer 拆分 合并 调整组件 在

  • Redux模块化拆分reducer函数流程介绍

    目录 1. 概述 2. 方式1-单纯文件拆分 3. 方式2-使用中间件redux-thunk进行模块拆分 1. 概述 使用 redux 库中提供的 combineReducers 方法,可以将多个拆分 reducer 函数合并成统一的 reducer 函数,提供给 createStore 来使用.我们可以将 Redux 进行模块化拆分,再利用这个函数,将多个拆分 reducer 函数合并成统一的 reducer 函数,再传给 createStore 来使用. 2. 方式1-单纯文件拆分 redu

  • React从插槽、路由、redux的详细过程

    目录 1. React 插槽 2. React 路由 2.1 安装库 2.2 ReactRouter三大组件 2.3 路由其他方法 2.4 重定向组件 2.5 Switch组件 2.6 示例 3. redux 3.1 主要作用 3.2 使用步骤 4. react-redux 4.1 基本概念 内容 清楚React 插槽弄明白React 路由会使用 redux 及 react-redux 1. React 插槽 组建中写入内容,这些内容可以被识别和控制.React需要自己开发支持插槽功能.原理:父

  • 搭建React Native热更新平台的详细过程

    目录 一,什么是热更新 二,热更新方案 三,热更新原理 四,CDN 热更新方案 五,纯 CDN 方案的弊端 六,线上方案 七.整体方案梳理 八,总结 一,什么是热更新 所谓热更新,也叫做动态更新,一种类似 Web 的更新方式.相对于 App 的发版更新而言,热更新能及时的修复线上存在的问题,大幅的提升业务迭代效率.我们都知道,互联网业务讲究兵贵神速,如果业务能够通过热更新来快速发版和迭代,这就相当于在产品和用户之间搭建了一座能够随时通行的桥梁,代替了原来好几周才能有一次迭代的问题. 那么,热更新

  • React路由参数传递与嵌套路由的实现详细讲解

    目录 1. 页面路由参数传递 1.1 动态路由参数 1.2 search字符串 1.3 页面参数隐式传递 2. 嵌套路由 1. 页面路由参数传递 1.1 动态路由参数 描述: 以“/detail/:id”形式传递的数据,在落地组件中通过this.props.match.params得到. 使用: App.jsx: import React, { Component } from 'react' import { Route, Link, NavLink, Switch, Redirect } f

  • 详解如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在React项目中使用Redux react-thunk 中间件,作用:支持异步action 目录结构 Tips:与Redux无关的目录已省略 |--src |-- store Redux目录

  • 详解mongoDB主从复制搭建详细过程

    详解mongoDB主从复制搭建详细过程 实验目的搭建mongoDB主从复制 主 192.168.0.4 从 192.168.0.7 mongodb的安装 1: 下载mongodb www.mongodb.org 下载最新的stable版 查看自己服务器 适合哪个种方式下载(wget 不可以的 可以用下面方式下载) wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.0.5.tgz curl -O -L https

  • React从react-router路由上做登陆验证控制的方法

    本文介绍了React从react-router路由上做登陆验证控制的方法,分享给大家,具体如下: 验证代码 import React from 'react' import {connect} from 'react-redux'; function requireAuthentication(Component) { // 组件有已登陆的模块 直接返回 (防止从新渲染) if (Component.AuthenticatedComponent) { return Component.Authe

  • 优雅的在React项目中使用Redux的方法

    或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在React项目中使用Redux react-thunk 中间件,作用:支持异步action |--src |-- store Redux目录 |-- actions.js |-- index.js |-- reducers.js |-

  • React工作流程及Error Boundaries实现过程讲解

    目录 什么是Error Boundaries 步骤1:捕获错误 步骤2:构造callback 执行callback 总结 这里简单讲解下React工作流程,后文有用.分为三步: 触发更新 render阶段:计算更新会造成的副作用 commit阶段:在宿主环境执行副作用 副作用有很多,比如: 插入DOM节点 执行useEffect回调 好了,让我们进入主题. 什么是Error Boundaries React提供了两个与错误处理相关的API: getDerivedStateFromError:静态

  • React中前端路由的示例代码

    目录 一. url是什么 二. 使用步骤 一. url是什么 访问不同url, 展示不同的组件 二. 使用步骤 安装React路由:命令行中执行npm install react-router-dom --save(注意此处的版本为npm install react-router-dom@4.3.1 --save) 两个js文件,分别为list.js和newButton.js,要实现访问localhost:3000/button的时候就显示button.js:访问localhost:3000/l

  • React中的路由嵌套和手动实现路由跳转的方式详解

    目录 React的路由嵌套 手动路由的跳转 React的路由嵌套 接上一篇文章, 在上一篇文章中讲解了路由的基本介绍, 我再来介绍一下路由的其他用法 在开发中,路由之间是存在嵌套关系的. 这里我们假设Home页面中还有两个页面内容: 推荐列表和排行榜列表; 点击不同的链接可以跳转到不同的地方,显示不同的内容; <Routes> <Route path='/' element={<Navigate to="/home"/>}></Route>

随机推荐