【React】归纳篇(十)组件间通信方式之Redux | UI组件AntDesign | Redux-react

简介: 【React】归纳篇(十)组件间通信方式之Redux | UI组件AntDesign | Redux-react

react-router4

react-router概览

  • 1、react的一个插件库
  • 2、专门用于实现一个SPA应用
  • 3、基于react的项目都会用到该库

SPA

  • 1、点击页面中的链接不会刷新页面,本身也不会向服务器发送请求(即:页面地址的跳转都是在浏览器端实现的,不会去重新请求服务端获取 html,html 只是在应用初始化的时候加载一次。)
  • 2、点击路由链接时,只会发生页面局部更新
  • 3、数据通过ajax请求,在前端异步展示
  • 4、整个应用只有一个完整页面,该页面由各种组件构成,页面的切换其实就是不同组件的切换,你只需要在配置中把不同的路由路径和对应的组件关联上即可。

单页应用的功能示意图如下:

路由

在点击导航选项的时候,让对应内容填充的到页面,实现这种效果的方式就是路由。简单来说,路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径来请求不同的资源。

  • 路由是一个映射关系(key:value) router.get(path,function(rep,res))注册路由
  • key为路由路径,value是function或component

分类

  • 后台路由:node服务器端路由,value是function,用于处理客户端提交的请求并返回一个响应数据
  • 前台路由:浏览器端路由,value是component,当请求的是路由path时,浏览器端没有发送http请求,但界面会发生局部更新

后台路由

  • 注册路由:router.get(path,function(req,res){})
  • 当node接收到一个请求时,依据请求路径找到匹配的路由,调用路由中的函数来处理请求,返回响应数据

前台路由

  • 注册路由:
  • 当浏览器的hash变为#about时,当前路由组件就会变为About组件

前端路由的实现方式

let history = History.createBrowserHistory();
//let history = History.createHashHistory();//H5中写法,使用锚点方法记录哈希值
history.push(param) //设置
history.goBack() //回退
history.goForward() //前进
histroy.replace(param) //替换
history.listen((location)=>{})

React-router的使用

文档:

https://reacttraining.com/react-router/web/guides/philosophy

###相关API

1、组件

- <BrowserRouter>
- <HashRouter>
- <Router>
- <Redirect>
- <Link>
- <NavLink>
- <Switch> //切换

2、其他

  • history对象
  • match对象
  • withRouter函数

3、使用

先安装

npm install --save react-router-dom //web版本

路由组件view与非路由组件components

使用路由组件的时候:

链接换成导航路由链接。

组件要用路由组件包裹。

路由嵌套-路由组件的路由

思考:如何编写路由效果?

  • 1、编写路由组件
  • 2、在父路由组件中指定2个标签:
  • 路由链接<NavLink> or < Link>
  • 路由<Route>

向路由组件传递数据

通过路由链接传递数据,在路径中插入占位符(参数)

2种路由跳转的方式

用js方式,非标签方式:

  • push()方式,默认方式
  • replace()方式

this.props.history.push/replace/goBack/goForward

this.props.match

开源UI组件库

  • material-UI(www.material-ui.com)
  • and-design PC(ant.design/index-cn) mobile(mobile.ant.design/index-cn)

antD

如何按需打包需要的样式:

antD 把每个组件做成文件夹:

方式1:

babel-plugin-import插件,只加载有import 的组件。

先下载babel-plugin-import。然后写一个配置文件:.babelrc

方式2:(推荐)

在create-react-app下完成。

npm install react-app-rewired --save-dev
npm install babel-plugin-import --save-dev

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

redux (难点)

  • 语法套路深

文档:http://www.redux.org.cn

概览

  • redux 是一个独立专门用于做状态管理的JS库,不是React插件库
  • 它可以用在react,angular,vue等项目中,但基本与react配合使用
  • 作用:集中式管理react应用中多个组件共享的状态。

图片.png

  • Store : 核心,管理对象
    内部维护: state、 reducer
    核心方法: getState()获取状态;dispatch(action)分发事件,会触发Reducers调用;subscribe(listener)发布,重新渲染组件;

action:

  • 标识要执行行为的对象
  • 包含2个方面的属性
    type: 表示属性,值为字符串,唯一,必要属性
    xxx:数据属性,值类型任意,可选属性
    eg:
const action = {
  type:'INCREMENT',
  data:2
}
  • Action Creator(创建Action的工厂函数)
const increment = (number)=>({type:'INCREMENT',data:number})

reducer

  • 根据老的State和action,产生新的state的纯函数
export default function counter(state=0,action){
  switch(action.type){
    case 'INCREMENT':
      return state + action.data
    case 'DECREMENT':
      return state - action.data
    default:
      return state
  }
}

注意:

  • 返回的是一个新的状态;
  • 不要修改原来的状态;

store对象

  • 将state,action与reducer联系在一起的对象
  • 如何得到此对象?
import {createStore} from 'redux'
import reducer from './reducers'
const store = createStore(reducer)

此对象的功能?

getState(): 得到state

dispatch(action): 分发action,触发reducer调用,产生新的state

subscribe(listener): 注册监听,当产生新的state时,自动调用

  • React Components : 通过Store读取状态并显示;更新状态;
  • dispatch(action):分发(触发)事件 type、data (事件机制)
  • Reducers(oldState,action){return newState} 旧状态返回新状态
  • Action Creators 工厂函数 ,生产action函数,用type标识函数类型。

什么情况需要redux:

  • 某个组件的状态,需要共享
  • 某个状态需要在任何地方都可以拿到
  • 一个组件需要改变全局状态
  • 一个组件需要改变另一个组件的状态

使用

一个规定的套路。需要多写几遍。

  • react-redux

1、一个react插件库

2、专门用于简化react应用中使用redux

使用redux先写好结构:

  • 在src中新建redux和containers文件夹
  • 在redux文件夹下写好如下文件名:图片.png

使用Provider组件对dispatch、subscribe、getState…进行全局管理

React-Redux 将所有组件分为两大类

  • UI组件

只负责UI的呈现,不带有任何业务逻辑

通过props接收数据,一般数据和函数

不使用任何Redux的API

一般保存在components文件下

  • 容器组件

负责管理数据和业务逻辑,不负责UI的呈现

使用Redux的APi

一般保存在containers文件夹下

Redux调式工具

步骤:

1、Chrome插件 redux-devtools

2、npm install --save-dev redux-devtools-extension

3、编码

import {composeWidthDevTools} from 'redux-devtools-extension'
const store = createStore(
  counter,
  composeWidthDevTools(applyMiddleware(thunk))
)

Redux、React-Redux还是比较复杂,还是要多看文档与练习,掌握其中的套路。



相关文章
|
6月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
11月前
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
383 68
|
11月前
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
342 67
|
11月前
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
428 62
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
278 57
|
移动开发 前端开发 JavaScript
React音频播放列表组件:常见问题、易错点与解决方案
本文介绍了在React中实现音频播放列表时常见的挑战及解决方案。通过基础实现、常见问题分析和最佳实践,帮助开发者避免状态管理、生命周期控制和事件处理中的陷阱。关键点包括使用`useRef`操作音频元素、`useState`同步播放状态、全局状态管理防止多音频同时播放、以及通过`useEffect`清理资源。还提供了代码示例和跨浏览器兼容性处理方法,确保高效实现功能并减少调试时间。
416 30
|
移动开发 前端开发 UED
React 音频音量控制组件 Audio Volume Control
在现代Web应用中,音频播放功能不可或缺。React以其声明式编程和组件化开发模式,非常适合构建复杂的音频音量控制组件。本文介绍了如何使用HTML5 `&lt;audio&gt;`元素与React结合,实现直观的音量控制系统,并解决了常见问题如音量范围不合理、初始音量设置及性能优化等,帮助开发者打造优秀的音频播放器。
440 27
|
编解码 前端开发 开发者
React 图片组件样式自定义:常见问题与解决方案
在 React 开发中,图片组件的样式自定义常因细节问题导致布局错乱、性能损耗或交互异常。本文系统梳理常见问题及解决方案,涵盖基础样式应用、响应式设计、加载状态与性能优化等,结合代码案例帮助开发者高效实现图片组件的样式控制。重点解决图片尺寸不匹配、边框阴影不一致、移动端显示模糊、加载失败处理及懒加载等问题,并总结易错点和最佳实践,助力开发者提升开发效率和用户体验。
508 22
|
移动开发 前端开发 开发者
React 音频播放控制组件 Audio Controls
本文介绍了如何使用React构建音频播放控制组件,涵盖HTML5 `&lt;audio&gt;`标签和React组件化思想的基础知识。针对常见问题如播放状态管理、进度条更新不准确及跨浏览器兼容性,提供了详细的解决方案和代码示例。同时,还总结了易错点及避免方法,如确保音频加载完成再操作、处理音频错误等,帮助开发者实现稳定且功能强大的音频播放器。
487 11
|
移动开发 前端开发 UED
React 音频进度条组件 Audio Progress Bar
在现代Web开发中,音频播放功能不可或缺。使用React构建音频进度条组件,不仅能实现播放控制和拖动跳转,还能确保代码的可维护性和复用性。本文介绍了如何利用HTML5 `&lt;audio&gt;`标签的基础功能、解决获取音频时长和当前时间的问题、动态更新进度条样式,并避免常见错误如忘记移除事件监听器和忽略跨浏览器兼容性。通过这些方法,开发者可以打造高质量的音频播放器,提升用户体验。
554 6