请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于这节课中使用 getStore() 来返回 store 的问题

我看了老师在另外两个同学的问题下的回答,一个回答是「不然的话大家不都用一个数据了么,每个人应该有自己的数据啊」,另一个是「如果导出的是一个 store 实例,这个实例是单例的,也就是永远都是那一个,那么所有用户相当于公用一个 store 了」。

1.关于使用函数的方式返回新的对象的原因我是理解的。但我的问题是,不同的用户请求服务器的页面,不应该都会重新执行一次 React 的代码吗?那重新执行一次应该生成的对象也就完全不同了,那为什么还需要使用函数的方式返回呢?

2.因为我对服务器端运行 React 的流程并不是很了解,也许并不是的重新执行,可能会保留 store。但对于客户端,每个用户第一次请求页面,都应该是重新执行 React 的代码,那肯定不同的用户之间的 store 是完全独立的,那在客户端也就不需要使用函数的方式进行返回了。

3.对于服务器端使用 Redux,我想只有做首屏渲染的时候有用,而后面用户的所有操作都是由客户端来执行,所以 Redux 的初始化数据对于每个用户应该是相同的,不同的 Redux 数据也应该是当页面第一次返回到客户端,由客户端根据本地数据发送请求然后更改的,比如用户登录后会根据用户信息来返回数据。对于这种情况,我在想是否在服务器端就算是共用同一个 store 也没有任何的影响,除非是客户端的操作会让服务器去操作服务器端的 Redux,但我觉得这样肯定是有问题的,一是对服务器而言会增加消耗,二是对于服务器端,数据不应该存储在数据库吗?

因此,我觉得使用 getStore() 来返回 store 让我很迷惑,希望老师能给出合理的解答。

正在回答

3回答

昨天刚看完这节内容,今天看有人问这个问题我也有些疑惑,刚又看了一下老师的视频,说一下我的看法。

1、并不是每一次访问服务器,服务器都要重跑代码的。

服务器启动之后,就开始监听客户的访问,每来一个请求,服务器都会执行app.user('*', () => {})里的代码。其中,getStore()就是每个请求来了之后,服务器必会执行的。老师课程里用的是函数返回动态创建的store,这是肯定能保证不同请求得到的store不一样的。反过来,如果我们将动态创建store改成直接export default store,也就是事先创建好一个store,然后每个请求来了之后都返回这个store,那显然所有请求访问的都是这一个store。

如果实在存在困惑的话,可以将函数改成直接返回。开启本地node服务,打开多个浏览器tab请求这个node服务器。比如第一个页面请求home页面,这时候服务器上的store应该会将home页的列表数据请求并注入到页面里的window.context里。然后你再打开另一个tab页,直接打开login对应的页面,如果他们共用的是一个store的话,那login页面也会被注入home页的列表数据。

上面这个实验可以试一试。

2、感觉客户端既然是每次刷新都重新执行一遍获取store的代码,那这步操作是不是放在函数里就无关紧要了,放也是对的,不放也是对的。

3、服务器端的数据确实只对第一次访问有效果。但是如果第一次访问就是公用的store,a用户访问了home页,服务器请求了a对应的home list列表存在了服务器端的store里,b用户直接访问了login页,这时候由于共用store,服务器将共用的store返给了b用户,b用户获取到了a用户的home list列表数据,这时候b用户在客户端跳转到home页,由于已经有数据了,就不会在发请求,b用户看到的是a用户的home list数据而不是自己的。这是不是就乱套了。

希望以上回答能帮到你,如果有什么不对,也可以指出

0 回复 有任何疑惑可以回复我~
  • 提问者 HarryZhao #1
    是的,在共享的情况是会存在这样的问题,非常感谢。
    回复 有任何疑惑可以回复我~ 2019-01-15 23:20:39
提问者 HarryZhao 2018-12-27 20:57:12

首先感谢老师的回复,针对回复我想补充一些问题。


1.针对 1 的补充。老师所说「第二次去执行 react 代码」,是指服务器上运行 React 吗?

2.针对 3 的回复,对于根据用户身份不同,展示不同页面内容这样的分功能,我不是很确定如何去做,因为我的项目经验很少,如果要做,我可能会将用户的登录信息存储在本地 LocalStorage,然后需要使用到这个信息的时候,取出来发送给服务器,告诉服务器是哪个用户,然后根据用户返回不同页面的内容。然后,我想问的是,如果 store 不是共享的,在服务器上,服务器是如何保存这些不同用户请求返回的不同 store 的?还有,在现阶段的代码情况下,store 是怎么共享的?


0 回复 有任何疑惑可以回复我~
  • Dell #1
    1.是的
    2. store每次你访问都会重新生成,根本没有共享啊。同学我觉得你现在可能使用store并没有用的特别深入,我建议你再做几个项目,回来再听一遍课程。
    回复 有任何疑惑可以回复我~ 2018-12-29 00:54:42
  • 提问者 HarryZhao 回复 Dell #2
    1.您的课程我是非常仔细的听的,每一次为什么要使用这个代码我都有反复的去听,但如果课程本身就没有对这个问题有足够的解释的话,那我听再多遍也可能找不到答案。既然课程有问答的服务,我想我通过这个服务来获取答案应该是最好的渠道。2.关于老师在 5-3 使用函数封装返回 store 的方式,其实对于后面的课程来说是非常好的,因为后面会牵涉到对服务器端与客户端返回不同的 store 的逻辑,将不同的逻辑放在不同的执行环境中并使用函数封装是很好的形式,但是在这节课老师在说其原因时并不是因为需要返回不同的 store,而是说 store 是单例,可能会共享,那如果说因为服务器会保留 store 而共享,那服务器又是如何做到在通过函数形式返回不同 store 的情况下不共享的?难道服务器会保留这些不同的 store?我很好奇,希望老师给一个合理的解释。
    回复 有任何疑惑可以回复我~ 2018-12-29 13:26:32
  • Dell 回复 提问者 HarryZhao #3
    同学啊,这个问题我都回答过好几次了,你的模块是单例的,单例的不就是共享的么。搜索下单例模式,你才能知道我说的是什么意思。而函数返回,就是为了把单例变成多例。 这个问题的核心是commonJs的模块是单例的,你一定要自己查一下单例是什么。
    回复 有任何疑惑可以回复我~ 2018-12-29 22:49:17
Dell 2018-12-27 00:48:54
  1. 重新访问,还是去引用store,但是store是单例的,如果你第二次去执行react代码,用的还是第一次生成好的store,并不会重新执行store中的代码。

  2. 是的

  3. 我想问一下你,如果你store共享,我如何来做根据用户身份不同,展示不同页面内容这样的功能?

0 回复 有任何疑惑可以回复我~
  • 提问者 HarryZhao #1
    由于直接回复回答,文字没有办法设置格式,我把回复重新发在一个新的回答下面了。
    回复 有任何疑惑可以回复我~ 2018-12-27 20:55:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信