react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法
在上一篇文章中说过了react中界面A跳到B,返回A,A界面状态保持不变,上篇中使用的是传统的localStorage方法,现在来使用第二种redux的state方法来实现这个功能
现在我刚接触redux,所以可能一些高级方法不是很会用,这边使用的是很简单的方法。其实这两种方法原理差不多,都是通过进行保存原有数据或者重新加载数据来实现
我这边以购物车的商品为简单的例子,大家可以根据自己的场景来增加,原理都是一样的
首先在action.js中定义个保存你数据的方法
// actions.js // 商品相关
export const ADD_To_CART = 'ADD_TO_CART';
export const DELETE_TO_CART ='DELETE_TO_CART';
export const UPDATE_TO_CART = 'UPDATE_TO_CART';
/*数值相关*/
export const ADD = 'ADD';
export const SUB = 'SUB';
/*标志相关*/
export const FLAG = 'FLAG';
export function addToCart(product,quantity,unitCost){ //我想要保存的商品列表
return {
type: ADD_To_CART,
payload: {product,quantity,unitCost}
}
}
export function flag(flag){ //根据这个flag标志来判断是不是加载原有的数据还是重新请求数据
return {
type:FLAG,
payload:{flag}
}
}
redux文件夹里面有三个文件,一个是商品的,一个是标志的,一个是把这两个合并到一起的
// src/reducers/cart-reducer.js
import {ADD_To_CART, DELETE_TO_CART,UPDATE_TO_CART} from "../action";
//初始化state
const initialState = {
cart: [
{
product: 'bread 700g',
quantity: 2,
unitCost: 90
},
{
product: 'milk 500ml',
quantity: 1,
unitCost: 57
}
]
}
export default function (state = initialState, action){
switch (action.type) {
case ADD_To_CART: {
return {
...state,
cart:[...state.cart,action.payload]
}
}
case DELETE_TO_CART:{
return {
...state,
cart:state.cart.filter((item,key)=>{
if(item.product!=action.payload.product){
return item;
}
})
}
}
case UPDATE_TO_CART:{
return {
...state,
cart:state.cart.map((item,key)=>{
if(item.product == action.payload.product){
return action.payload
}
else{
return item
}
})
}
}
default : return state
}
}
// src/reducers/flag-reducer.js
import {FLAG} from '../action'
export default function (state=false,action){
switch (action.type) {
case FLAG :
return action.payload.flag
default :
return state
}
}
import {combineReducers} from 'redux';
import productReducer from './product-reducer';
import cartReducer from './cart-reducer'
import flagSlogn from './flag-reducer'
const allReducer = {
product:productReducer,
shoppingCart : cartReducer,
flagSolgn:flagSlogn
}
const rootReducer = combineReducers(allReducer);
export default rootReducer
然后创建store.js
import {createStore} from 'redux';
import rootReducer from './reducer'
let store = createStore(rootReducer);
export default store
在你的js界面中使用
import React, {Component} from 'react';
import store from '../store/store'
import {addToCart, deleteToCart, updateToCart,flag} from "../store/action";
import {Link} from 'react-router-dom';
class Home extends React.Component {
constructor(props) {
super(props);
this.state = {
cart: [],
}
}
componentDidMount() {if(store.getState().flagSolgn){ //判断是不是跳转了的按钮,点击了从子界面返回的时候就加载原有的数据
this.setState({
cart:store.getState().shoppingCart.cart
})
}
else{ //没有点击,就按照初始化的来
this.setState({
cart:[]
})
store.dispatch(addToCart('Coffee 500mg', 1, 250));
store.dispatch(addToCart('Flour lkg', 2, 440));this.setState({
cart: store.getState().shoppingCart.cart
})
}
}
addProduct(){
store.dispatch(addToCart('Green Tea',5,25));
this.setState({
cart:store.getState().shoppingCart.cart,
})
}
render() {
const {cart} = this.state;
return (
<div>
<ul>
{
cart.map((item,key)=>{
return (
<li key={key}><ul><li>{item.product}</li><li>{item.quantity}</li><li>{item.unitCost}</li></ul></li>
)
})
}
</ul>
<Link to={{pathname:"/HomePage"}}>跳转子界面</Link>
<div>
<button onClick={this.addProduct.bind(this)}>增加</button>
</div>
</div>
)
}
}
export default Home;
子界面的内容可以随便写,毕竟你需要的只是,从子界面返回到父界面,父界面中状态保持不变的效果,你只需要的是在进入子界面的时候,改变这个flag就好了
import React, {Component} from 'react';
import store from '../store/store'
import {add, flag, sub} from '../store/action'
class HomePage extends React.Component {
constructor(props) {
super(props);
this.state = {
count:0
}
}
componentDidMount() {
store.dispatch(flag(true)); //父界面进入子界面的标志位
}
addCount(){
store.dispatch(add(2));
this.setState({
count:store.getState().product
})
}
subCount(){
store.dispatch(sub(3));
this.setState({
count:store.getState().product
})
}
render() {
const {count} = this.state;
return (
<div>
子界面得到store
{store.getState().shoppingCart.cart[0].product}
<div>
<button onClick={this.addCount.bind(this)}>增加</button>
</div>
<div>
<button onClick={this.subCount.bind(this)}>减少</button>
</div>
<p>数值: {count}</p>
</div>
)
}
}
export default HomePage;
然后你可以在除此以外的其他界面把这个flag变为false,就好了
注:这边推荐个初学者学习redux的例子,讲的很清楚了 https://segmentfault.com/a/1190000011474522?utm_source=tag-newest
react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法的更多相关文章
- 关于在React中 报Super expression must either be null or a function, not undefined (采坑系列)
今天突然在联系React中遇到一开始就报 Super expression must either be null or a function, not undefined 百度,各种方法,.. ...
- djang小项目过程中的小问题 02(跳转界面)
我觉着自己生下来就是解决问题的 ##1. 今天在使用登录注册模板时,输入后缀index,正常显示登录界面,但是点击 立即注册 之后不会跳转到注册页面 因为我观察到后缀名发生变化了,但是出发点是错的,前 ...
- 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter
PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...
- react中简单倒计时跳转
其实在react中实现倒计时的跳转方法有很多中,其中我认为较为好用的就是通过定时器更改state中的时间值. 首先在constructor中设置10秒的时间值: constructor () { su ...
- react跳转url,跳转外链,新页面打开页面
react中实现在js中内部跳转路由,有两种方法. 方法一: import PropTypes from 'prop-types'; export default class Header exten ...
- React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)
本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 中类 Vue 的控制指令,与指令式界面设计相关. 1. 指令式界面设计 Vue 与 A ...
- 总结PHP中几种常用的网页跳转代码
网页跳转的意思就是指当你在浏览器中访问A页面时,会自动跳转到B页面,往往网页跳转用在404页面中会比较多点.至于怎么实现网页跳转,网上已经提供了很多的方法,有些方法是不可行的,经过测试,叶德华今天就在 ...
- Web设计中打开新页面或页面跳转的方法 js跳转页面
Web设计中打开新页面或页面跳转的方法 一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx ...
- JSP中客户端跳转与服务器端跳转的区别
转载自:https://www.cnblogs.com/memewry/archive/2012/08/21/2649988.html 客户端跳转时用HttPservletResopse对象的send ...
随机推荐
- python字典中列表追加数据
dict = {} for i in range(1, 6): if i not in dict: dict[i] = [] for j in range(101, 106): dict[i].app ...
- 转载:wepy框架入门
转载:https://www.jianshu.com/p/93d5a4b99777 安装 wepy 命令行工具. npm install wepy-cli -g 在开发目录生成开发DEMO. wepy ...
- sched_yield()和nanosleep()对进程调度的影响
关键词:sched_yield().nanosleep()等等. sched_yield()主动放弃CPU执行权,nanosleep()是睡眠一段时间后再唤醒. 1. sched_yield()实现 ...
- 4. java 流程控制
一.判断语句 1. if 判断 if(关系表达式){ 语句体; } int age = 16; if(age >= 18){ System.out.println("hello&quo ...
- IDEA如何打包可运行jar,外部引用jar包版
背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用,发布时,也需要打成可运行的JAR包.并且,如果依赖第三方jar时,又不希望第三方 ...
- configparser读取配置文件时的相对路径问题
学习接口测试时,当我把配置文件xx.config和读取配置文件的模块read_config.py放在项目下的同一个包config里时,只需传入文件名xx.config即可实现对配置文件的读取. 但是当 ...
- 记一个bootstrap定制container导致页面X轴出现横向滚动条的坑
壹 ❀ 引 在bootstrap定制时,因为UI给的图纸的页面主体部分宽度为1200px,所以我将container容器宽度从默认的1170px改成了1200px,随后在页面缩小的调试过程中发现了页 ...
- 手摸手教你bootstrap定制
老实说我一直不太喜欢使用bootstrap,bootstrap样式组件虽然丰富但实际开发使用到的不多:栅格系统虽然好用,满屏div也是看的头疼:所以当经理说要用bootstrap开发新项目的时候,我内 ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 5
23.3 接口的安全控制规范 23.2节的示例实现了一个简单接口,但是这个接口此时是在“裸奔”的.因为这个接口所有人都可以请求,不仅我们的客户端可以正常访问数据,如果有人使用如fiddler.wir ...
- Spring提供JdbcTemplate&NamedParameterJdbcTemplate
JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修 ...