redux 实现弹出框案例

实现效果,点击显示按钮出现弹出框,点击关闭按钮隐藏弹出框

  1. 新建弹出框组件 src/components/Modal.js, 在index.js中引入app组件,在app中去显示计数器和弹出框组件
  1. function Modal ({ showState, show, hide }) {
  2. const styles = {
  3. width: 200,
  4. height: 200,
  5. position: 'absolute',
  6. top: '50%',
  7. left: '50%',
  8. marginTop: -100,
  9. marginLeft: -100,
  10. backgroundColor: 'skyblue',
  11. }
  12. return <div>
  13. <button>显示</button>
  14. <button>隐藏</button>
  15. <div style={styles}></div>
  16. </div>
  17. }
  1. 弹出框组件显示隐藏是一个状态,所以我们存储到store中,命名为show,因为需要出发action来修改store中的状态所系我们需要创建modal.actions.js文件,来存储控制显示隐藏的action,我们还是把显示与隐藏aciton的type定义为常量方便导入使用
  1. // src/store/const/modal.const.js
  2. export const SHOWMODAL = 'showModal'
  3. export const HIDEMODAL = 'hideModal'
  4. // src/store/actions/modal.actions.js
  5. import { SHOWMODAL, HIDEMODAL} from './../const/modal.const'
  6. export const show = () => ({type: SHOWMODAL})
  7. export const hide = () => ({type: HIDEMODAL})
  8. // src/store/reducers/counter.reducers.js
  9. import { INCREMENT, DECREMENT } from './../const/counter.const'
  10. import { SHOWMODAL, HIDEMODAL } from './../const/modal.const'
  11. const initialState = {
  12. count: 0,
  13. // 增加控制modal 显示隐藏显示的状态,默认为隐藏状态
  14. show: false
  15. }
  16. // eslint-disable-next-line import/no-anonymous-default-export
  17. export default (state = initialState, action) => {
  18. switch (action.type) {
  19. case INCREMENT:
  20. return {
  21. count: state.count + action.payload
  22. }
  23. case DECREMENT:
  24. return {
  25. count: state.count - action.payload
  26. }
  27. case SHOWMODAL:
  28. return {
  29. show: true
  30. }
  31. case HIDEMODAL:
  32. return {
  33. show: false
  34. }
  35. default:
  36. return state
  37. }
  38. }
  1. 弹框的显示隐藏状态用display属性控制所以我们需要把状态映射到props属性中,因为show状态与show显示方法重名了,所以给show状态起一个别名,利用 bindActionCreators 方法把 执行 dispatch 提交actions的方法映射到props中
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import * as modalActions from './../store/actions/modal.actions'
  4. import { bindActionCreators } from 'redux'
  5. function Modal ({ showState, show, hide }) {
  6. const styles = {
  7. width: 200,
  8. height: 200,
  9. position: 'absolute',
  10. top: '50%',
  11. left: '50%',
  12. marginTop: -100,
  13. marginLeft: -100,
  14. backgroundColor: 'skyblue',
  15. // 增加控制显示隐藏的css样式
  16. display: showState ? 'block' : 'none'
  17. }
  18. return <div>
  19. <button onClick={show}>显示</button>
  20. <button onClick={hide}>隐藏</button>
  21. <div style={styles}></div>
  22. </div>
  23. }
  24. // 映射显示英藏状态到props中
  25. const mapStateToProps = state => {
  26. return {
  27. showState: state.show
  28. }
  29. }
  30. // 把提交actions方法映射到组件props中
  31. const mapDispacthToProps = dispatch => bindActionCreators(modalActions, dispatch)
  32. export default connect(mapStateToProps,mapDispacthToProps)(Modal)

通过上面我们发现在点击显示与隐藏之后计数器组件中的数字不见了,因为我们在执行显示与隐藏的方法中并没有返回 计数器的状态所以这个状态丢失掉了,我们需要在更改状态的时候去补上原有的状态

  1. 补上原有状态
  1. export default (state = initialState, action) => {
  2. switch (action.type) {
  3. case INCREMENT:
  4. return {
  5. ...state,
  6. count: state.count + action.payload
  7. }
  8. case DECREMENT:
  9. return {
  10. ...state,
  11. count: state.count - action.payload
  12. }
  13. case SHOWMODAL:
  14. return {
  15. ...state,
  16. show: true
  17. }
  18. case HIDEMODAL:
  19. return {
  20. ...state,
  21. show: false
  22. }
  23. default:
  24. return state
  25. }
  26. }

这个时候我们的计数器与弹出框组件都已经正常了,但是我们发现reducer函数随着actions动作越来越多变的越来越臃肿,在状态越来越多以后将会变得无法维护

拆分reducer 函数

在计数器与弹出框案例中,在reducer函数中,我们既匹配到了计数器案例中的actions,又匹配到了弹出框案例中的actions 这样reducer中的代码将会越来越庞大,越来越臃肿,所以我们接下来拆分reducer,拆分reducer我们需要用到 combineReducers 方法,这个方法要求我们传递一个对象 这个对象是状态对象,返回值是合并后的reducer

  1. 创建 src/store/reducers/modal.reducers.js 文件,把弹出框的reducer抽离出来
  1. import { SHOWMODAL, HIDEMODAL } from './../const/modal.const'
  2. const initialState = {
  3. show: false
  4. }
  5. // eslint-disable-next-line import/no-anonymous-default-export
  6. export default (state = initialState, action) => {
  7. switch (action.type) {
  8. case SHOWMODAL:
  9. return {
  10. ...state,
  11. show: true
  12. }
  13. case HIDEMODAL:
  14. return {
  15. ...state,
  16. show: false
  17. }
  18. default:
  19. return state
  20. }
  21. }
  1. 创建src/store/reducers/root.reducers.js 文件,用于合并计数器与弹出框的reducer
  1. import { combineReducers } from 'redux'
  2. import CounterReducers from './counter.reducers'
  3. import ModalReducers from './modal.reducers'
  4. // 要求我们传递一个对象 这个对象是状态对象
  5. // 这样写了之后 状态的结构将是这样 counter: { count: 0 } modaler: { show: false }
  6. export default combineReducers({
  7. counter: CounterReducers,
  8. modaler: ModalReducers
  9. })
  1. 因为使用 combineReducers 合并reducer的时候改变了state的结构所以我们需要在组件中去更改获取state的方式
  1. // src/components/Count.js
  2. const mapStateProps = ({ counter }) => ({
  3. count: counter.count,
  4. a: '1'
  5. })
  6. // src/components/Modal.js
  7. const mapStateToProps = ({ modaler }) => {
  8. return {
  9. showState: modaler.show
  10. }
  11. }

使用react+redux实现弹出框案例的更多相关文章

  1. JavaScript插件——弹出框

    (JavaScript插件——弹出框) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.htm ...

  2. bootstrap中popover.js(弹出框)使用总结+案例

    bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...

  3. 尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框

    尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框 近期正在逐步摸索学习React的用法,尝试着写几个通用型的组件,整体项目还是根据webpack+react+css-me ...

  4. react native仿微信性别选择-自定义弹出框

    简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...

  5. [RN] React Native 封装选择弹出框(ios&android)

    之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以就自己写了一下,最最重要的是ios和Android通用. ...

  6. React native 的弹出层(输入)效果

    /*弹出层测试*/ import React,{Component} from 'react'; import { StyleSheet, View, Image, Text, TouchableOp ...

  7. 在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建

    通常,在同一个页面上实现增删改查,会通过弹出框实现异步的添加和修改,这很好.但有些时候,是不希望在页面上弹出框的,我们可能会想到Knockoutjs,它能以MVVM模式实现同一个页面上的增删改查,再辅 ...

  8. Bootstrap popover弹出框

    popover被挤压.遮挡的问题: 弹出框显示的时候如果贴近一个列的边沿,就会很窄或被遮挡,解决起来很简单,只需在初始化的时候添加一个container属性就可以了: $(function (){ $ ...

  9. Selenium+java - 弹出框处理

    一.弹出框分类: 弹出框分为两种,一种基于原生JavaScript写出来的弹窗,另一种是自定义封装好的样式的弹出框,本文重点介绍原生JavaScript写出来的弹窗,另一种弹窗用click()基本就能 ...

随机推荐

  1. 产品 | GreatSQL,打造更好的MGR生态

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 用 ...

  2. Eclipse里项目名有红叉,但是项目里的每一个文件都没有红叉

    原因一:导入的文件被删除了. 解决方法:右击项目名,在弹出的菜单中,选择"Bulid Path"-->"configure build path"--&g ...

  3. MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu......

    报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu...... 原因: 1.第一次配置参数时,不完整,出现错误!,(报错也会产生CMak ...

  4. 【JDBC】学习路径5-提取JDBCUtils工具类

    回顾我们上面几节的内容,我们发现重复代码非常多,比如注册驱动.连接.关闭close()等代码,非常繁杂. 于是我们将这些重复的大段代码进行包装.提取成JDBCUtils工具类. 第一章:提取注册连接模 ...

  5. 业务流程可视化-让你的流程图"Run"起来(7.运行状态持久化&轻量工作流支持)

    前言 感谢大家阅读本项目系列文章和对项目的支持.分享一下我对这个项目的新的改进. 之前项目做到了流程设计可视化和流程运行结果可视化. 本期发布的版本中实现了中间的运行过程的实时可视化,和流程状态持久化 ...

  6. Linux之搭建FTP服务

    引用:FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Proto ...

  7. Python之创建数据库及功能示例样本

    创建数据库实例 import pymysql db= pymysql.connect(host="localhost",user="root",password ...

  8. Oracle 与 PostgreSQL 函数行为的差异引发性能差异

    对于Oracle,对于数据修改的操作通过存储过程处理,而对于函数一般不进行数据修改操作.同时,函数可以通过 Select 进行调用,而存储过程则不行. 一.对于volatile 函数的行为 1.Ora ...

  9. Thrift RPC改进—更加准确的超时管理

    前言: 之前我们组内部使用Thrift搭建了一个小型的RPC框架,具体的实现细节可以参考我之前的一篇技术文章:https://www.cnblogs.com/kaiblog/p/9507642.htm ...

  10. idea每次换行后光标都跑到最左边问题

    最进用idea时发现每次换行之后一段时间光标会自动跑到最左边,默认把我的首行空格删掉了 IDEA版本为:IntelliJ IDEA 2020.2.3 x64