react-router-dom中link与Navlink
<h2>Link</h2><p>现在,我们应用需要在各个页面间切换,如果使用锚点元素实现,在每次点击时,页面被重新加载,React Router提供了<Link>组件用来避免这种状况发生。当 你点击<Link>时,url会更新,组件会被重新渲染,但是页面不会重新加载</p>
<p>嗯、先看个例子</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <Link to="/about">关于</Link>
<span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> to为obj</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <Link to=<span style="color: rgba(0, 0, 0, 1)">{{
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> pathname: '/courses'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> search: '?sort=name'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> hash: '#the-hash'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> state: { fromDashboard: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> }}/>
<span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> replace </span>
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <Link to="/courses" replace /></pre>
</div>
<p><Link>使用to参数来描述需要定位的页面。它的值既可是字符串,也可以是location对象(包含pathname、search、hash、与state属性)如果其值为字符串,将会被转换为location对象</p>
<p>replace(bool):为 true 时,点击链接后将使用新地址替换掉访问历史记录里面的原地址;为 false 时,点击链接后将在原有访问历史记录的基础上添加一个新的纪录。默认为 false;</p>
<p>点击Link后,路由系统发生了什么?</p>
<p>Link 组件最终会渲染为 HTML 标签 <a>,它的 to、query、hash 属性会被组合在一起并渲染为 href 属性。虽然 Link 被渲染为超链接,但在内部实现上使用脚本拦截了浏览器的默认行为,然后调用了history.pushState 方法(注意,文中出现的 history 指的是通过 history 包里面的 create*History 方法创建的对象,window.history 则指定浏览器原生的 history 对象,由于有些 API 相同,不要弄混)。history 包中底层的 pushState 方法支持传入两个参数 state 和 path,在函数体内有将这两个参数传输到 createLocation 方法中,返回 location 的结构如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> location =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">2</span> pathname, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前路径,即 Link 中的 to 属性</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> search, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> search</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> hash, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> hash</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> state, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> state 对象</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> action, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> location 类型,在点击 Link 时为 PUSH,浏览器前进后退时为 POP,调用 replaceState 方法时为 REPLACE</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> key, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用于操作 sessionStorage 存取 state 对象</span>
<span style="color: rgba(0, 128, 128, 1)">8</span> };</pre>
</div>
<p>系统会将上述 location 对象作为参数传入到 TransitionTo 方法中,然后调用 window.location.hash 或者window.history.pushState() 修改了应用的 URL,这取决于你创建 history 对象的方式。同时会触发history.listen 中注册的事件监听器。<br>NavLink<br><NavLink>是<Link>的一个特定版本,会在匹配上当前的url的时候给已经渲染的元素添加参数,组件的属性有</p>
<p>activeClassName(string):设置选中样式,默认值为active<br>activeStyle(object):当元素被选中时,为此元素添加样式<br>exact(bool):为true时,只有当导致和完全匹配class和style才会应用<br>strict(bool):为true时,在确定为位置是否与当前URL匹配时,将考虑位置pathname后的斜线<br>isActive(func)判断链接是否激活的额外逻辑的功能<br>嗯、看例子就懂了</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> activeClassName选中时样式为selected</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <<span style="color: rgba(0, 0, 0, 1)">NavLink
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> to="/faq"
<span style="color: rgba(0, 128, 128, 1)"> 4</span> activeClassName="selected"
<span style="color: rgba(0, 128, 128, 1)"> 5</span> >FAQs</NavLink>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 选中时样式为activeStyle的样式设置</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <<span style="color: rgba(0, 0, 0, 1)">NavLink
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> to="/faq"
<span style="color: rgba(0, 128, 128, 1)">10</span> activeStyle=<span style="color: rgba(0, 0, 0, 1)">{{
</span><span style="color: rgba(0, 128, 128, 1)">11</span> fontWeight: 'bold'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">12</span> color: 'red'
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> }}
</span><span style="color: rgba(0, 128, 128, 1)">14</span> >FAQs</NavLink>
<span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当event id为奇数的时候,激活链接</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> const oddEvent = (match, location) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">match) {
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">21</span> const eventID =<span style="color: rgba(0, 0, 0, 1)"> parseInt(match.params.eventID)
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">return</span> !isNaN(eventID) && eventID % 2 === 1
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <<span style="color: rgba(0, 0, 0, 1)">NavLink
</span><span style="color: rgba(0, 128, 128, 1)">26</span> to="/events/123"
<span style="color: rgba(0, 128, 128, 1)">27</span> isActive=<span style="color: rgba(0, 0, 0, 1)">{oddEvent}
</span><span style="color: rgba(0, 128, 128, 1)">28</span> >Event 123</NavLink></pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<p> 转载自 https://blog.csdn.net/lhjuejiang/article/details/80366839</p><br><br>
来源:https://www.cnblogs.com/yangzhiqiang/p/11574673.html
頁:
[1]