11.1 单页应用
您可以在百度里搜索“深入浅出React和Redux 艾草文学(www.321553.xyz)”查找最新章节!
11.1 单页应用
如果使用传统的多页面实现方式,那就是每次页面切换都是一次网页的刷新,每次切换页面的时候都遵照以下步骤:
1)浏览器的地址栏发生变化指向新的URL,于是浏览器发起一个HTTP请求到服务器获取页面的完整HTML;
2)浏览器获取到HTML内容后,解析HTML内容;
3)浏览器根据解析的HTML内容确定还需要下载哪些其他资源,包括JavaScript和CSS资源;
4)浏览器会根据HTML和其他资源渲染页面内容,然后等待用户的其他操作;
然后,当用户点击网页内某个链接引起URL的改变,又会重复上面的步骤。
上述方法虽然正统,但是存在很大的浪费。每个页面切换都要刷新一次页面,用户体验不会很好。而且,对于同一个应用,不同页面之间往往有共同点,比如共同的顶栏和侧栏,当在页面之间切换的时候,最终结果只是局部的内容变化,却要刷新整个网页,实在是没有必要。
业界已经有很多提高多页面应用的方案,让用户能够感觉是在不同“页面”之间切换,但是实际上页面并没有刷新,只是局部更新,这种看起来多页面但是其实只有一个页面的应用,被称为“单页应用”(Single Page Application),虽然名为“单页”,但其实目的是制造视觉上的“多页”。
在本章中,我们来探讨如何用React和Redux实现单页应用。
首先我们来确定单页应用要达到的目标,如下所示:
·不同页面之间切换不会造成网页的刷新;
·页面内容和URL保持一致。
第一点好理解,是单页应用的基本要求。第二点“页面内容和URL保持一致”分两个方面:第一个方面是指当页面切换的时候,URL会对应改变,这通过浏览器的History API可以实现在不刷新网页的情况下修改URL;另一方面,用户在地址栏直接输入某个正确的URL时,网页上要显示对应的正确内容,这一点非常重要。
当用户在单页应用上浏览时,发现一个特别精彩的内容,可以把这一页的URL复制保存下来,回头重新打开这个URL,看到的内容应该就是当初保存这个URL时的内容,而不只是这个网页应用的默认页面,这也就是所谓的“可收藏”(Bookmarkable)应用。
举个例子,假设某个应用包含两个“页面”,路径分别为foo和bar,两个页面都包含指向对方的链接。当用户访问foo页面时,浏览器地址栏显示的URL地址部分为foo。当用户点击指向bar页面的链接时,URL地址部分必须转换成bar,同时页面内容也转换为bar页面的内容,这时候利用浏览器的刷新按钮强行刷新页面,用户应该看到的还是bar页面的内容。
如果一个应用能够有上述的表现,那就是一个合格的单页应用。不过,要做到这一点,服务器必须要能够响应所有正确的URL请求,毕竟,只有服务器对URL请求回应HTML,我们的JavaScript代码才有可能发挥作用。
到目前为止,本书中例子的React应用代码都是在浏览器中执行的,服务器返回的HTML实际上没有任何可视的内容,作用只是引入JavaScript代码,以及创建一个空的div作为供React应用大展拳脚的竞技场而已。这样一来,对于任何一个URL,只需要返回一个同样的HTML页面就可以了,反正一切应用逻辑都在浏览器执行的JavaScript代码中。
由create-react-app创建的React应用天生具有上述的服务器功能,当访问一个public目录下存在的资源时,就返回这个资源,否则都返回默认资源index.html,所以开发者什么都不用做,就已经具备了一个支持单页应用的服务器端。
接下来,我们构建一个简单的单页应用,我们需要用上React-Router库。 深入浅出React和Redux