Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Props在一次刷新中更新了3次

Props在一次刷新中更新了3次
EN

Stack Overflow用户
提问于 2020-06-26 12:19:45
回答 1查看 37关注 0票数 0

我是一个反应新手,我从一开始就尝试使用react-redux风格。下面是我为一个简单的产品列表页面所做的尝试。

在我的App.js中检查用户是否仍在登录。

代码语言:javascript
运行
AI代码解释
复制
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {}
  }

  componentDidMount() {
    if (isUserAuthenticated() === true) {
      const token = window.localStorage.getItem('jwt');
      if (token) {
        agent.setToken(token);
      }
      this.props.appLoad(token ? token : null, this.props.history);
    }
  }

  render() {
    const PrivateRoute = ({ component: Component, ...rest }) => (
      <Route {...rest} render={(props) => (
        isUserAuthenticated() === true
          ? <Component {...props} />
          : <Redirect to='/logout' />
      )} />
    )

    return (

      <React.Fragment>
        <Router>
          <Switch>
            {routes.map((route, idx) =>
              route.ispublic ?
                <Route path={route.path} component={withLayout(route.component)} key={idx} />
                :
                <PrivateRoute path={route.path} component={withLayout(route.component)} key={idx} />
            )}
          </Switch>
        </Router>
      </React.Fragment>
    );
  }
}

export default withRouter(connect(mapStatetoProps, { appLoad })(App));

在my action.js appLoaded中,操作如下所示

代码语言:javascript
运行
AI代码解释
复制
export const appLoad = (token, history) => {
    return {
        type: APP_LOAD,
        payload: { token, history }
    }
}

用于它的reducer.js

代码语言:javascript
运行
AI代码解释
复制
import { APP_LOAD, APP_LOADED, APP_UNLOADED, VARIFICATION_FAILED } from './actionTypes';

const initialState = {
    appName: 'Etsync',
    token: null,
    user: null,
    is_logged_in: false
}

const checkLogin = (state = initialState, action) => {
    switch (action.type) {
        case APP_LOAD:
            state = {
                ...state,
                user: action.payload,
                is_logged_in: false
            }
            break;

        case APP_LOADED:
            state = {
                ...state,
                user: action.payload.user,
                token: action.payload.user.token,
                is_logged_in: true
            }
            break;
        case APP_UNLOADED:
            state = initialState
            break;
        case VARIFICATION_FAILED:
            state = {
                ...state,
                user: null,
            }
            break;
        default:
            state = { ...state };
            break;
    }
    return state;
}

export default checkLogin;

在Saga.js中,我观察了每个appLoad操作,并按如下方式执行了操作

代码语言:javascript
运行
AI代码解释
复制
import { takeEvery, fork, put, all, call } from 'redux-saga/effects';

import { APP_LOAD } from './actionTypes';
import { appLoaded, tokenVerificationFailed } from './actions';
import { unsetLoggeedInUser } from '../../helpers/authUtils';
import agent from '../agent';
function* checkLogin({ payload: { token, history } }) {
    try {
        let response = yield call(agent.Auth.current, token);
        yield put(appLoaded(response));
    } catch (error) {
        if (error.message) {
            unsetLoggeedInUser();
            yield put(tokenVerificationFailed());
            history.push('/login');
        } else if (error.response.text === 'Unauthorized') {
            unsetLoggeedInUser();
            yield put(tokenVerificationFailed());
        }
    }
}

export function* watchUserLogin() {
    yield takeEvery(APP_LOAD, checkLogin)
}

function* commonSaga() {
    yield all([fork(watchUserLogin)]);
}

export default commonSaga;

之后,对于productLists页面,我的代码如下

代码语言:javascript
运行
AI代码解释
复制
//importing part

class EcommerceProductEdit extends Component {

    constructor(props) {
        super(props);
        this.state = {}
    }

    componentDidMount() {
        **//seeing the props changes**
        console.log(this.props);
        this.props.activateAuthLayout();
        if (this.props.user !== null && this.props.user.shop_id)
            this.props.onLoad({
                payload: Promise.all([
                    agent.Products.get(this.props.user),
                ])
            });
    }

    render() {

        return (
            // JSX code removed for making code shorter
        );
    }
}

const mapStatetoProps = state => {
    const { user, is_logged_in } = state.Common;
    const { products } = state.Products.products.then(products => {
                    return products;
    });
    return { user, is_logged_in, products };
}

export default connect(mapStatetoProps, { activateAuthLayout, onLoad })(EcommerceProductEdit);

但在componentDidMount的这个页面中,如果我记录道具,我会在控制台中得到三次。如下

休息,一切都很好。我只是担心,我正在做的代码不符合标准。任何类型的见解都是高度赞赏的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 12:25:57

这是因为你有三个状态更新,不能批量渲染。

首先在没有数据的情况下渲染。您可以在第一个日志中看到这一点。没有用户,他们也没有登录。然后你就会得到一个用户。您可以在第二个日志中看到这一点。有一个用户,但他们没有登录。然后你让他们登录。您可以在第三个日志中看到这一点。有一个用户,他们已经登录了。

如果所有这些都是在单独的步骤中完成的,并在每个步骤中更新Redux存储,那么您将在每个步骤之间渲染。但是,如果您获得了用户,并将他们登录,然后在同一时间范围内以redux状态存储他们,那么您只会呈现额外的时间。请记住,React和Redux是高度异步的库,它们试图使用批处理来确保在同一时间框架内完成的事情只会导致一次渲染,但有时您需要同时处理多个网络步骤。所以你没有做错任何事,你只是有很多步骤不能很容易地放在同一个框架中,因为它们依赖于一些外部资源,这些资源有自己的异步获取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62594619

复制
相关文章
AWS负载均衡器侦听转发规则配置
在VPC架构实现高可用的情况下,通过elb负载均衡器针对不同目标组的不同应用设定转发规则,从而实现利用负载均衡器的A记录+端口/配置的PATH路径访问到相应目标组的主机应用上。
Weiyang
2020/04/20
1.9K0
AWS负载均衡器侦听转发规则配置
配置Azure负载均衡器对Web应用程序进行负载均衡(一)
前面的文章中给大家介绍了Azure负载均衡器的一些基本概念及其使用场景。今天的文章会带大家来实际配置一下Azure负载均衡器。本地实验会按照如下架构图进行:
李珣
2022/05/07
3660
配置Azure负载均衡器对Web应用程序进行负载均衡(一)
配置Azure负载均衡器对Web应用程序进行负载均衡(二)
点击“创建资源”—“计算”—“Windows Server 2016 Datacenter”:
李珣
2022/05/07
6710
配置Azure负载均衡器对Web应用程序进行负载均衡(二)
负载均衡器的作用是什么?负载均衡器的部署方式有哪些?
大家平时生活中是经常需要访问互联网的,无论是休闲娱乐还是查资料往往都要用到网络,网络中用户们访问的过程中是需要通过各种服务器的,很多时候访问互联网的用户们会遇到卡顿的情况,这种情况就有可能是服务器过载了,仅有的服务器组支持不了大量用户们的访问,在现有的网络基础上面现在很多公司还会使用负载均衡技术,那么负载均衡原理是什么?负载均衡技术是如何实现的?
用户8715145
2021/10/18
1.4K0
手把手 | 关于商业部署机器学习,这有一篇详尽指南
有关深度学习或机器学习方面的文章层出不穷,涵盖了数据收集,数据整理,网络/算法选择,训练,验证和评估等主题。
大数据文摘
2018/07/31
7210
手把手 | 关于商业部署机器学习,这有一篇详尽指南
[Linux]F5负载均衡器
F5配置最简单负载均衡,需要配置的参数有Node(节点)、Pool(资源池)、和Virtual Server(虚拟服务器),它们的关系是,先配置Node,然后配置VS。Node是最基本的定义,如每个服务器就是一个Node,负载均衡Pool是一组Node接收和处理流量的一组设备,如web服务器集群。BIGIP系统将客户机流量请求发送到Pool成员中的任一服务器上(Node),然后将Pool与BIGIP系统中的Virtual server相关联,最后,BIGIP系统将进入Virtual Server中流量传输到Pool成员,Pool再传达给Node。
唯一Chat
2019/09/10
2.1K0
[Linux]F5负载均衡器
AWS alb 了解
Elastic Load Balancing 在一个或多个可用区中的多个目标(如 EC2 实例、容器和 IP 地址)之间自动分配传入的流量。它会监控已注册目标的运行状况,并仅将流量传输到运行状况良好的目标。Elastic Load Balancing 根据传入流量随时间的变化对负载均衡器进行扩展。它可以自动扩展来处理绝大部分工作负载。
heidsoft
2022/01/17
2.3K0
AWS alb 了解
[享学Netflix] 五十七、Ribbon负载均衡器ILoadBalancer(二):ZoneAwareLoadBalancer具备区域意识、动态服务列表的负载均衡器
上文介绍了负载均衡器ILoadBalancer的基本内容,并且详述了基本实现:BaseLoadBalancer。它实现了作为ILoadBalancer负载均衡器的基本功能,比如:服务列表维护、服务定时探活、负载均衡选择Server等。
YourBatman
2020/03/24
3.6K0
金三银四加薪季,性能测试面试题了解一波
Hi,大家好,今天依然是金三银四面试系列,如果你想了解之前的面试相关文章可以在文末点击👉「阅读原文」查看更多或者点击以下👇「蓝色字」查看最近文章。 金三银四跳槽季,自动化面试题预热一波 金三银四求职季,接口自动化面试题助攻一波 金三银四季招聘季,APP测试面试题温新一遍 以下分享性能测试相关面试题,欢迎在文末留言补充评论✍️。 一 解释常用的性能指标名称与具体含义 性能测试是通过测试工具模拟多种正常、峰值及异常负载条件来对系统的各项性能指标进行测试。验证软件系统是否能够达到用户提出的性能指标,发现系统中
可可的测试小栈
2021/03/15
5590
金三银四加薪季,性能测试面试题了解一波
性能测试是通过测试工具模拟多种正常、峰值及异常负载条件来对系统的各项性能指标进行测试。验证软件系统是否能够达到用户提出的性能指标,发现系统中存在的性能瓶颈并加以优化。
可可的测试小栈
2021/03/16
5050
Spring Cloud中负载均衡器概览
在上篇文章中(RestTemplate的逆袭之路,从发送请求到负载均衡)我们完整的分析了RestTemplate的工作过程,在分析的过程中,我们遇到过一个ILoadBalancer接口,这个接口中有一
江南一点雨
2018/04/02
9910
Spring Cloud中负载均衡器概览
漫画:通俗易懂负载均衡器
你可能已经多次听说过Load Balancer(此负载均衡器)。负载均衡基本上意味着在多个服务器之间分配网络流量,这样可以确保没有任何一台服务器自己承担所有负载。当网络流量平衡时,应用程序就可以平稳运行。
五月君
2021/01/13
8730
漫画:通俗易懂负载均衡器
HAProxy负载均衡器用法详解
上一篇我们介绍了四层的负载均衡器LVS, 这次我们我们介绍另外一种负载均衡器HAProxy。
小土豆Yuki
2020/06/15
13.9K0
DNS负载均衡与负载均衡器两种方案的选择[通俗易懂]
  web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。   高可靠性可以看作为系统的一种冗余设定。对于一个特定的请求,如果所申请的服务器不能进行处理的话,那么其他的服务器能不能对之进行有效的处理呢?对于一个高效的系统,如果一个Web服务器失败的话,其他的服务器可以马上取代它的位置,对所申请的请求进行处理,而且这一过程对用户来说,要尽可能的透明,使用户察觉不到!   稳定性决定了应用程序能否支持不断增长的用户请求数量,它是应用程序自身的一种能力。稳定性是影响系统性能的众多因素的一种有效的测量手段,包括机群系统所能支持的同时访问系统的最大用户数目以及处理一个请求所需要的时间。   在现有众多的均衡服务器负载的方法中,广泛研究并使用的是以下两个方法:   DNS负载平衡的方法RR-DNS(Round-Robin Domain Name System)   负载均衡器
全栈程序员站长
2022/09/14
1.3K0
Ribbon 负载均衡器 LoadBalancer 源码解析
什么是负载均衡?简单来说一个应用,后台有多个服务来支撑,即利用多台服务器提供单一服务,当某个服务挂了或者负载过高的时候,负载均衡器能够选择其他的服务来处理请求,用来提高应用的高可用性和高并发行;此外,当用户请求过来的时候,负载均衡器会将请求后台内网服务器,内网服务器将请求的响应返回给负载平衡器,负载平衡器再将响应发送到用户,这样可以阻止了用户直接访问后台服务器,使得服务器更加安全。
Java技术编程
2020/05/21
2.1K0
1.1 自定义负载均衡器
我们现在有两个服务, 一个getway服务, 另一个是order服务. 使用的是nacos管理配置文件和服务注册中心
用户7798898
2020/09/27
1.1K0
1.1 自定义负载均衡器
集群部署看过来,低代码@AWS智能集群的架构与搭建方案
为了帮助充分利用AWS的托管服务快速构建起一套集群环境,彻底去掉“单一故障点”,实现最高的可用性,我们准备了《低代码智能集群@AWS的架构与搭建方案》看完本文,带你掌握“基于nginx配置服务器集群”。
葡萄城控件
2022/12/02
1.7K0
点击加载更多

相似问题

与amazon负载均衡器的最大并发连接

11

AWS应用程序负载均衡器是否处理反向代理?

249

采用经典负载均衡器的AWS应用程序负载均衡器

03

如何在Jmeter中找出服务器每秒可处理的最大并发请求数

230

增加特殊wcf服务上的最大并发处理请求数

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文