uTools-Manuals/docs/vue/guide/migration-vue-router.html
2019-04-21 11:50:48 +08:00

339 lines
30 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="content guide with-sidebar migration-vue-router-guide">
<h1>从 Vue Router 0.7.x 迁移</h1>
<blockquote>
<p>只有 Vue Router 2 是与 Vue 2 相互兼容的,所以如果你更新了 Vue ,你也需要更新 Vue Router 。这也是我们在主文档中将迁移路径的详情添加进来的原因。<br/>有关使用 Vue Router 2 的完整教程,请参阅 <a href="https://router.vuejs.org/zh-cn/" rel="noopener" target="_blank">Vue Router 文档</a></p>
</blockquote>
<h2 id="Router-初始化"><a class="headerlink" href="#Router-初始化" title="Router 初始化"></a>Router 初始化</h2><h3 id="router-start-替换"><a class="headerlink" href="#router-start-替换" title="router.start 替换"></a><code>router.start</code> <sup>替换</sup></h3><p>不再会有一个特殊的 API 用来初始化包含 Vue Router 的 app ,这意味着不再是:</p>
<pre><code class="hljs js">router.start({
<span class="hljs-attr">template</span>: <span class="hljs-string">'&lt;router-view&gt;&lt;/router-view&gt;'</span>
}, <span class="hljs-string">'#app'</span>)</code></pre>
<p>你只需要传一个路由属性给 Vue 实例:</p>
<pre><code class="hljs js"><span class="hljs-keyword">new</span> Vue({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">router</span>: router,
<span class="hljs-attr">template</span>: <span class="hljs-string">'&lt;router-view&gt;&lt;/router-view&gt;'</span>
})</code></pre>
<p>或者,如果你使用的是运行时构建 (runtime-only) 方式:</p>
<pre><code class="hljs js"><span class="hljs-keyword">new</span> Vue({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">router</span>: router,
<span class="hljs-attr">render</span>: <span class="hljs-function"><span class="hljs-params">h</span> =&gt;</span> h(<span class="hljs-string">'router-view'</span>)
})</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>router.start</code> 被调用的示例。</p>
</div>
<h2 id="Route-定义"><a class="headerlink" href="#Route-定义" title="Route 定义"></a>Route 定义</h2><h3 id="router-map-替换"><a class="headerlink" href="#router-map-替换" title="router.map 替换"></a><code>router.map</code> <sup>替换</sup></h3><p>路由现在被定义为一个在 router 实例里的一个 <a href="https://router.vuejs.org/zh-cn/essentials/getting-started.html#javascript" rel="noopener" target="_blank"><code>routes</code> 选项</a>数组。所以这些路由:</p>
<pre><code class="hljs js">router.map({
<span class="hljs-string">'/foo'</span>: {
<span class="hljs-attr">component</span>: Foo
},
<span class="hljs-string">'/bar'</span>: {
<span class="hljs-attr">component</span>: Bar
}
})</code></pre>
<p>会以这种方式定义:</p>
<pre><code class="hljs js"><span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> VueRouter({
<span class="hljs-attr">routes</span>: [
{ <span class="hljs-attr">path</span>: <span class="hljs-string">'/foo'</span>, <span class="hljs-attr">component</span>: Foo },
{ <span class="hljs-attr">path</span>: <span class="hljs-string">'/bar'</span>, <span class="hljs-attr">component</span>: Bar }
]
})</code></pre>
<p>考虑到不同浏览器中遍历对象不能保证会使用相同的键值,这种数组的语法可以保证更多可预测的路由匹配。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>router.map</code> 被调用的示例。</p>
</div>
<h3 id="router-on-移除"><a class="headerlink" href="#router-on-移除" title="router.on 移除"></a><code>router.on</code> <sup>移除</sup></h3><p>如果你需要在启动的 app 时通过代码生成路由,你可以动态地向路由数组推送定义来完成这个操作。举个例子:</p>
<pre><code class="hljs js"><span class="hljs-comment">// 普通的路由</span>
<span class="hljs-keyword">var</span> routes = [
<span class="hljs-comment">// ...</span>
]
<span class="hljs-comment">// 动态生成的路由</span>
marketingPages.forEach(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">page</span>) </span>{
routes.push({
<span class="hljs-attr">path</span>: <span class="hljs-string">'/marketing/'</span> + page.slug
component: {
<span class="hljs-attr">extends</span>: MarketingComponent
data: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">return</span> { <span class="hljs-attr">page</span>: page }
}
}
})
})
<span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> Router({
<span class="hljs-attr">routes</span>: routes
})</code></pre>
<p>如果你需要在 router 被实例化后增加新的路由,你可以把 router 原来的匹配方式换成一个包括你新添的加路由的匹配方式:</p>
<pre><code class="hljs js">router.match = createMatcher(
[{
<span class="hljs-attr">path</span>: <span class="hljs-string">'/my/new/path'</span>,
<span class="hljs-attr">component</span>: MyComponent
}].concat(router.options.routes)
)</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>router.on</code> 被调用的示例。</p>
</div>
<h3 id="router-beforeEach-changed"><a class="headerlink" href="#router-beforeEach-changed" title="router.beforeEach changed"></a><code>router.beforeEach</code> <sup>changed</sup></h3><p><code>router.beforeEach</code> 现在是异步工作的,并且携带一个 <code>next</code> 函数作为其第三个参数。</p>
<pre><code class="hljs js">router.beforeEach(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">transition</span>) </span>{
<span class="hljs-keyword">if</span> (transition.to.path === <span class="hljs-string">'/forbidden'</span>) {
transition.abort()
} <span class="hljs-keyword">else</span> {
transition.next()
}
})</code></pre>
<pre><code class="hljs js">router.beforeEach(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">to, from, next</span>) </span>{
<span class="hljs-keyword">if</span> (to.path === <span class="hljs-string">'/forbidden'</span>) {
next(<span class="hljs-literal">false</span>)
} <span class="hljs-keyword">else</span> {
next()
}
})</code></pre>
<h3 id="subRoutes-换名"><a class="headerlink" href="#subRoutes-换名" title="subRoutes 换名"></a><code>subRoutes</code> <sup>换名</sup></h3><p>出于 Vue Router 和其他路由库一致性的考虑,重命名为<a href="https://router.vuejs.org/zh-cn/essentials/nested-routes.html" rel="noopener" target="_blank"><code>children</code></a></p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>subRoutes</code> 选项的示例。</p>
</div>
<h3 id="router-redirect-替换"><a class="headerlink" href="#router-redirect-替换" title="router.redirect 替换"></a><code>router.redirect</code> <sup>替换</sup></h3><p>现在用一个<a href="https://router.vuejs.org/zh-cn/essentials/redirect-and-alias.html" rel="noopener" target="_blank">路由定义的选项</a>作为代替。举个例子,你将会更新:</p>
<pre><code class="hljs js">router.redirect({
<span class="hljs-string">'/tos'</span>: <span class="hljs-string">'/terms-of-service'</span>
})</code></pre>
<p>成像下面的<code>routes</code>配置里定义的样子:</p>
<pre><code class="hljs js">{
<span class="hljs-attr">path</span>: <span class="hljs-string">'/tos'</span>,
<span class="hljs-attr">redirect</span>: <span class="hljs-string">'/terms-of-service'</span>
}</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>router.redirect</code> 被调用的示例。</p>
</div>
<h3 id="router-alias-替换"><a class="headerlink" href="#router-alias-替换" title="router.alias 替换"></a><code>router.alias</code> <sup>替换</sup></h3><p>现在是你进行 alias 操作的<a href="https://router.vuejs.org/zh-cn/essentials/redirect-and-alias.html" rel="noopener" target="_blank">路由定义里的一个选项</a>。举个例子,你需要在你的<code>routes</code>定义里将:</p>
<pre><code class="hljs js">router.alias({
<span class="hljs-string">'/manage'</span>: <span class="hljs-string">'/admin'</span>
})</code></pre>
<p>配置这个样子:</p>
<pre><code class="hljs js">{
<span class="hljs-attr">path</span>: <span class="hljs-string">'/admin'</span>,
<span class="hljs-attr">component</span>: AdminPanel,
<span class="hljs-attr">alias</span>: <span class="hljs-string">'/manage'</span>
}</code></pre>
<p>如果你需要进行多次 alias 操作,你也可以使用一个数组语法去实现:</p>
<pre><code class="hljs js">alias: [<span class="hljs-string">'/manage'</span>, <span class="hljs-string">'/administer'</span>, <span class="hljs-string">'/administrate'</span>]</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行<a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a>找到 <code>router.alias</code> 被调用的示例。</p>
</div>
<h3 id="任意的-Route-属性-替换"><a class="headerlink" href="#任意的-Route-属性-替换" title="任意的 Route 属性 替换"></a>任意的 Route 属性 <sup>替换</sup></h3><p>现在任意的 route 属性必须在新 meta 属性的作用域内,以避免和以后的新特性发生冲突。举个例子,如果你以前这样定义:</p>
<pre><code class="hljs js"><span class="hljs-string">'/admin'</span>: {
<span class="hljs-attr">component</span>: AdminPanel,
<span class="hljs-attr">requiresAuth</span>: <span class="hljs-literal">true</span>
}</code></pre>
<p>你现在需要把它更新成:</p>
<pre><code class="hljs js">{
<span class="hljs-attr">path</span>: <span class="hljs-string">'/admin'</span>,
<span class="hljs-attr">component</span>: AdminPanel,
<span class="hljs-attr">meta</span>: {
<span class="hljs-attr">requiresAuth</span>: <span class="hljs-literal">true</span>
}
}</code></pre>
<p>如果在一个路由上访问一个属性,你仍然会通过 meta 。举个例子:</p>
<pre><code class="hljs js"><span class="hljs-keyword">if</span> (route.meta.requiresAuth) {
<span class="hljs-comment">// ...</span>
}</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到任意的路由不在 meta 作用域下的示例。</p>
</div>
<h3 id="URL-中的-Query-数组-语法-移除"><a class="headerlink" href="#URL-中的-Query-数组-语法-移除" title="URL 中的 Query 数组 [] 语法 移除"></a>URL 中的 Query 数组 [] 语法 <sup>移除</sup></h3><p>当传递数组给 query 参数时URL 语法不再是 <code>/foo?users[]=Tom&amp;users[]=Jerry</code>,取而代之,新语法是 <code>/foo?users=Tom&amp;users=Jerry</code>,此时 <code>$route.query.users</code> 将仍旧是一个数组,不过如果在该 query 中只有一个参数:<code>/foo?users=Tom</code>当直接访问该路由时vue-router 将无法知道我们期待的 <code>users</code> 是个数组。因此,可以考虑添加一个计算属性并且在每个使用 <code>$route.query.users</code> 的地方以该计算属性代替:</p>
<pre><code class="hljs javascript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {
<span class="hljs-comment">// ...</span>
computed: {
<span class="hljs-comment">// 此计算属性将始终是个数组</span>
users () {
<span class="hljs-keyword">const</span> users = <span class="hljs-keyword">this</span>.$route.query.users
<span class="hljs-keyword">return</span> <span class="hljs-built_in">Array</span>.isArray(users) ? users : [users]
}
}
}</code></pre>
<h2 id="Route-匹配"><a class="headerlink" href="#Route-匹配" title="Route 匹配"></a>Route 匹配</h2><p>路由匹配现在使用 <a href="https://github.com/pillarjs/path-to-regexp" rel="noopener" target="_blank">path-to-regexp</a> 这个包,这将会使得工作与之前相比更加灵活。</p>
<h3 id="一个或者更多的命名参数-改变"><a class="headerlink" href="#一个或者更多的命名参数-改变" title="一个或者更多的命名参数 改变"></a>一个或者更多的命名参数 <sup>改变</sup></h3><p>语法稍微有些许改变,所以以<code>/category/*tags</code>为例,应该被更新为<code>/category/:tags+</code></p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到弃用路由语法的示例。</p>
</div>
<h2 id="链接"><a class="headerlink" href="#链接" title="链接"></a>链接</h2><h3 id="v-link-替换"><a class="headerlink" href="#v-link-替换" title="v-link 替换"></a><code>v-link</code> <sup>替换</sup></h3><p><code>v-link</code> 指令已经被一个新的 <a href="https://router.vuejs.org/zh-cn/api/router-link.html" rel="noopener" target="_blank"><code>&lt;router-link&gt;</code> 组件</a>指令替代,这一部分的工作已经被 Vue 2 中的组件完成。这将意味着在任何情况下,如果你拥有这样一个链接:</p>
<pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">v-link</span>=<span class="hljs-string">"'/about'"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
<p>你需要把它更新成:</p>
<pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">router-link</span> <span class="hljs-attr">to</span>=<span class="hljs-string">"/about"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">router-link</span>&gt;</span></code></pre>
<p>注意:<code>&lt;router-link&gt;</code>不支持<code>target="_blank"</code>属性,如果你想打开一个新标签页,你必须用<code>&lt;a&gt;</code>标签。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>v-link</code> 指令的示例。</p>
</div>
<h3 id="v-link-active-替换"><a class="headerlink" href="#v-link-active-替换" title="v-link-active 替换"></a><code>v-link-active</code> <sup>替换</sup></h3><p><code>v-link-active</code> 也因为指定了一个在 <a href="https://router.vuejs.org/zh-cn/api/router-link.html" rel="noopener" target="_blank"><code>&lt;router-link&gt;</code> 组件</a>上的 tag 属性而被弃用了。举个例子,你需要更新:</p>
<pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">v-link-active</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">v-link</span>=<span class="hljs-string">"'/about'"</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span></code></pre>
<p>成这个写法:</p>
<pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">router-link</span> <span class="hljs-attr">tag</span>=<span class="hljs-string">"li"</span> <span class="hljs-attr">to</span>=<span class="hljs-string">"/about"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">a</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">router-link</span>&gt;</span></code></pre>
<p> <code>&lt;a&gt;</code>标签将会成为真实的链接 (并且可以获取到正确的跳转),但是激活的类将会被应用在外部的<code>&lt;li&gt;</code>标签上。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>v-link-active</code> 指令的示例</p>
</div>
<h2 id="编程导航"><a class="headerlink" href="#编程导航" title="编程导航"></a>编程导航</h2><h3 id="router-go-改变"><a class="headerlink" href="#router-go-改变" title="router.go 改变"></a><code>router.go</code> <sup>改变</sup></h3><p>为了与 <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API" rel="noopener" target="_blank">HTML5 History API</a> 保持一致性,<code>router.go</code> 已经被用来作为 <a href="https://router.vuejs.org/zh-cn/essentials/navigation.html#routergon" rel="noopener" target="_blank">后退/前进导航</a><a href="https://router.vuejs.org/zh-cn/essentials/navigation.html#routerpushlocation" rel="noopener" target="_blank"><code>router.push</code> </a> 用来导向特殊页面。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> ,找到 <code>router.go</code><code>router.push</code> 指令被调用的示例。</p>
</div>
<h2 id="路由选择Modes"><a class="headerlink" href="#路由选择Modes" title="路由选择Modes"></a>路由选择Modes</h2><h3 id="hashbang-false-移除"><a class="headerlink" href="#hashbang-false-移除" title="hashbang: false 移除"></a><code>hashbang: false</code> <sup>移除</sup></h3><p>Hashbangs 将不再为谷歌需要去爬去一个网址,所以他们将不再成为哈希策略的默认选项。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>hashbang: false</code> 选项的示。</p>
</div>
<h3 id="history-true-替换"><a class="headerlink" href="#history-true-替换" title="history: true 替换"></a><code>history: true</code> <sup>替换</sup></h3><p>所有路由模型选项将被简化成一个单个的<a href="https://router.vuejs.org/zh-cn/api/options.html#mode" rel="noopener" target="_blank"><code>mode</code> 选项</a>。你需要更新:</p>
<pre><code class="hljs js"><span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> VueRouter({
<span class="hljs-attr">history</span>: <span class="hljs-string">'true'</span>
})</code></pre>
<p>成这个写法:</p>
<pre><code class="hljs js"><span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> VueRouter({
<span class="hljs-attr">mode</span>: <span class="hljs-string">'history'</span>
})</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>history: true</code> 选项的示。</p>
</div>
<h3 id="abstract-true-替换"><a class="headerlink" href="#abstract-true-替换" title="abstract: true 替换"></a><code>abstract: true</code> <sup>替换</sup></h3><p>所有路由模型选项将被简化成一个单个的<a href="https://router.vuejs.org/zh-cn/api/options.html#mode" rel="noopener" target="_blank"><code>mode</code> 选项</a>。你需要更新:</p>
<pre><code class="hljs js"><span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> VueRouter({
<span class="hljs-attr">abstract</span>: <span class="hljs-string">'true'</span>
})</code></pre>
<p>成这个写法:</p>
<pre><code class="hljs js"><span class="hljs-keyword">var</span> router = <span class="hljs-keyword">new</span> VueRouter({
<span class="hljs-attr">mode</span>: <span class="hljs-string">'abstract'</span>
})</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>abstract: true</code> 选项的示例。</p>
</div>
<h2 id="路由选项Misc"><a class="headerlink" href="#路由选项Misc" title="路由选项Misc"></a>路由选项Misc</h2><h3 id="saveScrollPosition-替换"><a class="headerlink" href="#saveScrollPosition-替换" title="saveScrollPosition 替换"></a><code>saveScrollPosition</code> <sup>替换</sup></h3><p>它已经被替换为可以接受一个函数的 <a href="https://router.vuejs.org/zh-cn/advanced/scroll-behavior.html" rel="noopener" target="_blank"><code>scrollBehavior</code> 选项</a>,所以滑动行为可以完全的被定制化处理 - 甚至为每次路由进行定制也可以满足。这将会开启很多新的可能,但是简单的复制旧的行为:</p>
<pre><code class="hljs js">saveScrollPosition: <span class="hljs-literal">true</span></code></pre>
<p>你可以替换为:</p>
<pre><code class="hljs js">scrollBehavior: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">to, from, savedPosition</span>) </span>{
<span class="hljs-keyword">return</span> savedPosition || { <span class="hljs-attr">x</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">y</span>: <span class="hljs-number">0</span> }
}</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>saveScrollPosition: true</code> 选项的示例。</p>
</div>
<h3 id="root-换名"><a class="headerlink" href="#root-换名" title="root 换名"></a><code>root</code> <sup>换名</sup></h3><p>为了与 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base" rel="noopener" target="_blank">HTML 的<code>&lt;base&gt;</code> 标签</a>保持一致性,重命名为 <code>base</code></p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>root</code> 选项的示例。</p>
</div>
<h3 id="transitionOnLoad-移除"><a class="headerlink" href="#transitionOnLoad-移除" title="transitionOnLoad 移除"></a><code>transitionOnLoad</code> <sup>移除</sup></h3><p>由于 Vue 的过渡系统 <a href="transitions.html#初始渲染的过渡"><code>appear</code> transition control</a> 的存在,这个选项将不再需要。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>transitionOnLoad: true</code> 选项的示例。</p>
</div>
<h3 id="suppressTransitionError-移除"><a class="headerlink" href="#suppressTransitionError-移除" title="suppressTransitionError 移除"></a><code>suppressTransitionError</code> <sup>移除</sup></h3><p>出于简化钩子的考虑被移除。如果你真的需要抑制过渡错误,你可以使用 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch" rel="noopener" target="_blank"><code>try</code><code>catch</code></a> 作为替代。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移指令</a> 找到 <code>suppressTransitionError: true</code> 选项的示例。</p>
</div>
<h2 id="路由挂钩"><a class="headerlink" href="#路由挂钩" title="路由挂钩"></a>路由挂钩</h2><h3 id="activate-替换"><a class="headerlink" href="#activate-替换" title="activate 替换"></a><code>activate</code> <sup>替换</sup></h3><p>使用 <a href="https://router.vuejs.org/zh-cn/advanced/navigation-guards.html#组件内的钩子" rel="noopener" target="_blank"><code>beforeRouteEnter</code></a> 这一组件进行替代。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>beforeRouteEnter</code> 钩子的示例。</p>
</div>
<h3 id="canActivate-替换"><a class="headerlink" href="#canActivate-替换" title="canActivate 替换"></a><code>canActivate</code> <sup>替换</sup></h3><p>使用<a href="https://router.vuejs.org/en/advanced/navigation-guards.html#perroute-guard" rel="noopener" target="_blank"><code>beforeEnter</code></a> 在路由中作为替代。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>canActivate</code> 钩子的示例。</p>
</div>
<h3 id="deactivate-移除"><a class="headerlink" href="#deactivate-移除" title="deactivate 移除"></a><code>deactivate</code> <sup>移除</sup></h3><p>使用<a href="../api/#beforeDestroy"><code>beforeDestroy</code></a> 或者 <a href="../api/#destroyed"><code>destroyed</code></a> 钩子作为替代。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>deactivate</code> 钩子的示例。</p>
</div>
<h3 id="canDeactivate-替换"><a class="headerlink" href="#canDeactivate-替换" title="canDeactivate 替换"></a><code>canDeactivate</code> <sup>替换</sup></h3><p>在组件中使用<a href="https://router.vuejs.org/zh-cn/advanced/navigation-guards.html#组件内的钩子" rel="noopener" target="_blank"><code>beforeRouteLeave</code></a> 作为替代。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移路径</a> 找到 <code>canDeactivate</code> 钩子的示例。</p>
</div>
<h3 id="canReuse-false-移除"><a class="headerlink" href="#canReuse-false-移除" title="canReuse: false 移除"></a><code>canReuse: false</code> <sup>移除</sup></h3><p>在新的 Vue 路由中将不再被使用。</p>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>canReuse: false</code> 选项的示例。</p>
</div>
<h3 id="data-替换"><a class="headerlink" href="#data-替换" title="data 替换"></a><code>data</code> <sup>替换</sup></h3><p><code>$route</code>属性是响应式的,所以你可以就使用一个 watcher 去响应路由的改变,就像这样:</p>
<pre><code class="hljs js">watch: {
<span class="hljs-string">'$route'</span>: <span class="hljs-string">'fetchData'</span>
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-attr">fetchData</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-comment">// ...</span>
}
}</code></pre>
<div class="upgrade-path">
<h4>升级路径</h4>
<p>运行 <a href="https://github.com/vuejs/vue-migration-helper" rel="noopener" target="_blank">迁移助手</a> 找到 <code>data</code> 钩子的示例。</p>
</div>
<h3 id="loadingRouteData-移除"><a class="headerlink" href="#loadingRouteData-移除" title="$loadingRouteData 移除"></a><code>$loadingRouteData</code> <sup>移除</sup></h3><p>定义你自己的属性 (例如:<code>isLoading</code>),然后在路由上的 watcher 中更新加载状态。举个例子,如果使用 <a href="https://github.com/mzabriskie/axios" rel="noopener" target="_blank">axios</a> 获取数据:</p>
<pre><code class="hljs js">data: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">posts</span>: [],
<span class="hljs-attr">isLoading</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">fetchError</span>: <span class="hljs-literal">null</span>
}
},
<span class="hljs-attr">watch</span>: {
<span class="hljs-string">'$route'</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>
self.isLoading = <span class="hljs-literal">true</span>
self.fetchData().then(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
self.isLoading = <span class="hljs-literal">false</span>
})
}
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-attr">fetchData</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">var</span> self = <span class="hljs-keyword">this</span>
<span class="hljs-keyword">return</span> axios.get(<span class="hljs-string">'/api/posts'</span>)
.then(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">response</span>) </span>{
self.posts = response.data.posts
})
.catch(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">error</span>) </span>{
self.fetchError = error
})
}
}</code></pre>
<div class="guide-links">
<span><a href="migration.html">从 Vue 1.x 迁移</a></span>
<span style="float: right;"><a href="migration-vuex.html">从 Vuex 0.6.x 迁移到 1.0</a></span>
</div>
<div class="footer">
<script src="//m.servedby-buysellads.com/monetization.js" type="text/javascript"></script>
<div class="bsa-cpc"></div>
<script>
(function(){
if(typeof _bsa !== 'undefined' && _bsa) {
_bsa.init('default', 'CKYD62QM', 'placement:vuejsorg', {
target: '.bsa-cpc',
align: 'horizontal',
disable_css: 'true'
});
}
})();
</script>
发现错误?想参与编辑?
<a href="https://github.com/vuejs/cn.vuejs.org/blob/master/srcmigration-vue-router.md" target="_blank">
在 GitHub 上编辑此页!
</a>
</div>
</div>