緔栤 發表於 2020-2-24 17:32:00

uni-app路由的封装

<h1 class="article-title" data-v-55484a2b="">uni-app路由的封装</h1>
<div class="article-content" data-v-55484a2b="" data-id="5d034d8e6fb9a07eab687d2c">
<h3 data-id="heading-0">更新内容</h3>
<p>&nbsp;</p>
<ol>
<li>&nbsp;配置路由</li>
<ol>
<li>此前版本需要手动配置路由,版本更新后将自动生成路由配置</li>
</ol>
<li>添加全局钩子</li>
<ol>
<li>此前不加全局钩子是为了性能</li>
<li>更新后会添加对应的钩子</li>
</ol>
<li>(=&amp;?)等特殊字符,将不会支持路由传参,各位可自行处理</li>
<ol>
<li>encodeURIComponent</li>
<li>decodeURIComponent</li>
</ol>
<li>
<h3 data-id="heading-1">新版Router使用方式</h3>
<p>在页面添加&nbsp;<code>navigate</code>类型是&nbsp;<code>Array</code>&nbsp;对应值是:<code>['navigateTo', 'switchTab', 'reLaunch', 'redirectTo']</code></p>
<p>用法</p>
<div>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">// 文件目录 pages/home/index.vue


<span class="hljs-built_in">export default {
navigate: [<span class="hljs-string">'navigateTo']
}
// 会生成 navigateTo 跳转的方式
// 会生成 name 值为 所在文件夹的名称(home)

<span class="hljs-built_in">export default {
navigate: [<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab']
}
// 会生成navigateTo、switchTab跳转的方式
// 会生成两条数据
// navigateTo 对应 name 值为 所在文件夹的名称(home)
// switchTab 对应 name 值为 所在文件夹的名称(swhome)

// 其他方式对应值
// reLaunch 对应 name 值为 所在文件夹的名称(relhome)
// redirectTo 对应 name 值为 所在文件夹的名称(redhome)
<span class="copy-code-btn">复制代码</span></span></span></span></span></span></code></pre>
</div>
<div>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">this.<span class="hljs-variable">$minRouter.push({
        // 这里的 name 对应上面生成的 name 值
    name: <span class="hljs-string">'home',
    // params 是页面传参类型最好是 Object
    params: { id: 1 }
})


// 不传参时可以直接如下写法
this.<span class="hljs-variable">$minRouter.push(<span class="hljs-string">'swhome')


// 获取页面参数
this.<span class="hljs-variable">$parseURL()

// 回退页面
this.<span class="hljs-variable">$minRouter.back(-1)<span class="copy-code-btn">复制代码</span></span></span></span></span></span></span></code></pre>
</div>
<p>项目中文件目录&nbsp;<code>router/index.js</code></p>
<p>可以设置路由拦截用法和&nbsp;<code>Vue</code>&nbsp;全局前置钩子类似</p>
</li>
<li>
<h3 data-id="heading-2">具体看&nbsp;github</h3>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>uni-app提供了路由功能来实现页面跳转,但是在使用的过程中我们还是发现有些不方便的地方,如下图:</p>
<p><img src="https://user-gold-cdn.xitu.io/2019/6/14/16b541205d97dc4f?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" data-width="608" data-height="345"></p>
<h3 data-id="heading-3">页面的跳转存在哪些问题呢</h3>
<ol>
<li>页面路径不好的管理问题</li>
<ol>
<li>为什么不好管理:就是改页面路径,或者说分包的时候不用一个个找着改</li>
</ol>
<li>传递参数的方式不太友好</li>
<ol>
<li>为什么不友好:需要手动拼接参数列表</li>
</ol>
<li>参数类型单一,只支持string</li>
<ol>
<li>不管传string还是number和boolean得到的都是字符串</li>
</ol>
<li>传特殊字符时会发现参数被截断(比如传二维码信息)</li>
<ol>
<li>原因是不能包括(=&amp;?)等特殊字符</li>
</ol></ol>首先先做一下准备工作
<div>
<p>&nbsp; &nbsp; 创建一个项目</p>
<p><img class="lazyload inited loaded" alt="" data-src="https://user-gold-cdn.xitu.io/2019/6/14/16b542a671803b33?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" data-width="792" data-height="614"></p>
<p>&nbsp;</p>
<div>第一个问题好解决,先做一个集中管理,创建一个文件(router.js)来集中管理,目录结构下</div>
<div>&nbsp;</div>
<div><img class="lazyload inited loaded" alt="" data-src="https://user-gold-cdn.xitu.io/2019/6/14/16b5432825fd2613?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" data-width="183" data-height="355"></div>
<p>&nbsp;</p>
<p>代码如下:</p>
<div>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash"><span class="hljs-built_in">export default {
// 首页页面
index: <span class="hljs-string">'/pages/index/index.vue',
// 我的页面
my: <span class="hljs-string">'/pages/my/index.vue'
}<span class="copy-code-btn"><br><br><br></span></span></span></span></code></pre>
</div>
<p>使用的时候变成这样</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">&lt;template&gt;
&lt;view class=<span class="hljs-string">"content"&gt;
    &lt;image class=<span class="hljs-string">"logo" src=<span class="hljs-string">"/static/logo.png"&gt;&lt;/image&gt;
    &lt;view&gt;
      &lt;text class=<span class="hljs-string">"title"&gt;{{title}}&lt;/text&gt;
    &lt;/view&gt;
    &lt;button @click=<span class="hljs-string">"openPage"&gt;跳转到我的页面&lt;/button&gt;
&lt;/view&gt;
&lt;/template&gt;
&lt;script&gt;
import url from <span class="hljs-string">'../../router'
<span class="hljs-built_in">export default {
    <span class="hljs-function"><span class="hljs-title">data() {
      <span class="hljs-built_in">return {
      title: <span class="hljs-string">'index'
      }
    },
    <span class="hljs-function"><span class="hljs-title">onLoad() {    },
    methods: {
      <span class="hljs-function"><span class="hljs-title">openPage () {
      uni.navigateTo({
          url: url.my
      })
      }
    }
}
&lt;/script&gt;<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>使用的时候需要引入router.js特别麻烦,先不解决这个问题</p>
<p>下面来看第二和第三个问题</p>
<p>先看个例子</p>
<p><img alt="" data-src="https://img2018.cnblogs.com/i-beta/1776959/202002/1776959-20200224173611271-82632920.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1776959/202002/1776959-20200224173638742-1063515035.png"><img class="lazyload inited" alt="" data-src="data:image/svg+xml;utf8,&lt;?xml version=&quot;1.0&quot;?&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; version=&quot;1.1&quot; width=&quot;403&quot; height=&quot;314&quot;&gt;&lt;/svg&gt;" data-width="403" data-height="314"></p>
<p>&nbsp;</p>
<p>参数比较多的情况下这样确实不好操作麻烦,能不能把参数部分单独拿出来然后拼接到url上面呢?</p>
<p>惊奇的发现传过来的数字竟然变成字符串了,参数不能保真</p>
<p>第四个问题就不演示了</p>
<p>废话不多说了,说了这么多,相信你们也应该知道问题的所在了,下面就来解决这些问题 (渐进式讲解)</p>
<p>首先创建一个文件(MinRouter.js)目录结构如下</p>
<p><img class="lazyload inited loaded" alt="" data-src="https://user-gold-cdn.xitu.io/2019/6/14/16b545aa2c6962d5?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" data-width="289" data-height="480"></p>
<h3 data-id="heading-4">下面代码解决了第一个问题</h3>
<p>不再需要使用是引入router.js文件</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import urlSet from <span class="hljs-string">'./router';
<span class="hljs-keyword">function openPage (url) {
    uni.navigateTo({
      url: `<span class="hljs-variable">${urlSet}`
    })
}
<span class="hljs-built_in">export default openPage<span class="copy-code-btn"><br></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>main.js文件做如下修改</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import Vue from <span class="hljs-string">'vue'
import App from <span class="hljs-string">'./App'
// 引入M<span class="hljs-keyword">inRouter文件
import openPage from <span class="hljs-string">'./MinRouter'
Vue.config.productionTip = <span class="hljs-literal">false
App.mpType = <span class="hljs-string">'app'
// 添加到全局
global.openPage = openPage
const app = new Vue({
    ...App
})
app.<span class="hljs-variable">$mount()<span class="copy-code-btn"><br><br><br></span></span></span></span></span></span></span></span></code></pre>
<p>使用方式</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">&lt;template&gt;
&lt;view class=<span class="hljs-string">"content"&gt;
      &lt;image class=<span class="hljs-string">"logo" src=<span class="hljs-string">"/static/logo.png"&gt;&lt;/image&gt;
      &lt;view&gt;
          &lt;text class=<span class="hljs-string">"title"&gt;{{title}}&lt;/text&gt;
      &lt;/view&gt;
      &lt;button @click=<span class="hljs-string">"toPage"&gt;跳转到我的页面&lt;/button&gt;
&lt;/view&gt;
&lt;/template&gt;
&lt;script&gt;
<span class="hljs-built_in">export default {
    <span class="hljs-function"><span class="hljs-title">data() {      
      <span class="hljs-built_in">return {
            title: <span class="hljs-string">'index'
      }
    },
    <span class="hljs-function"><span class="hljs-title">onLoad() {    },
    methods: {
      <span class="hljs-function"><span class="hljs-title">toPage () {
      global.openPage(<span class="hljs-string">'my')
      }   
}
}
&lt;/script&gt;<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<h3 data-id="heading-5">下面来解决第二和第三个问题</h3>
<p>第三个问题想必很多人都遇到过,本来就想传递一个number,结果不管传什么都会变成string。</p>
<p>有什么办法可以让数据变成字符串之后,还能还原成原来的类型?</p>
<p>使用JSON就能解决上面的问题了,而且也很好的解决了第二个问题</p>
<p>试着修改原来的代码</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import urlSet from <span class="hljs-string">'./router';
<span class="hljs-keyword">function openPage (url, query) {
const queryStr = JSON.stringify(query)
uni.navigateTo({
    url: `<span class="hljs-variable">${urlSet}?query=<span class="hljs-variable">${queryStr}`
})}
<span class="hljs-built_in">export default openPage<span class="copy-code-btn"><br></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>使用方式</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">&lt;template&gt;
&lt;view class=<span class="hljs-string">"content"&gt;
    &lt;image class=<span class="hljs-string">"logo" src=<span class="hljs-string">"/static/logo.png"&gt;&lt;/image&gt;
    &lt;view&gt;
      &lt;text class=<span class="hljs-string">"title"&gt;{{title}}&lt;/text&gt;
    &lt;/view&gt;
    &lt;button @click=<span class="hljs-string">"toPage"&gt;跳转到我的页面&lt;/button&gt;
&lt;/view&gt;&lt;/template&gt;&lt;script&gt;
<span class="hljs-built_in">export default {
    <span class="hljs-function"><span class="hljs-title">data() {
      <span class="hljs-built_in">return {
      title: <span class="hljs-string">'index'
      }
    },
    <span class="hljs-function"><span class="hljs-title">onLoad() {    },
    methods: {
      <span class="hljs-function"><span class="hljs-title">toPage () {
      global.openPage(<span class="hljs-string">'my', {id: 123})
      }
    }
}
&lt;/script&gt;<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<h3 data-id="heading-6">下面来解决第四个问题</h3>
<p>(=&amp;?)等特殊字符在url上面是有特殊含义的,所以我们要把json字符串encode一下</p>
<pre class="hljs 1c"><code class="hljs 1c copyable" lang="1c">import urlSet from './router';
function openPage (url, query) {
const queryStr = encodeURIComponent(JSON.stringify(query))
uni.navigateTo({
    url: `${urlSet}?query=${queryStr}`
})}
export default openPage<span class="copy-code-btn"><br></span></code></pre>
<p>&nbsp;</p>
<p>到此上面的问题全部解决了,但是感觉还是不太好,能不能封装成Vue插件,类似VueRouter</p>
<p>答案是肯定的</p>
<h3 data-id="heading-7">封装成型MinRouter</h3>
<p>&nbsp;</p>
<p>router.js文件改成如下</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import M<span class="hljs-keyword">inRouter from <span class="hljs-string">'./MinRouter'
// 配置路由
const router = new M<span class="hljs-keyword">inRouter({
routes: [
    {
      // 页面路径
      path: <span class="hljs-string">'pages/index/index',
      name: <span class="hljs-string">'index'
    },
    {
      path: <span class="hljs-string">'pages/my/index',
      name: <span class="hljs-string">'my'
    }
]
})
<span class="hljs-built_in">export default router<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></code></pre>
<p>main.js文件改成如下</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import Vue from <span class="hljs-string">'vue'
import App from <span class="hljs-string">'./App'
// 引入M<span class="hljs-keyword">inRouter文件
import M<span class="hljs-keyword">inRouter from <span class="hljs-string">'./MinRouter'
// 引入router文件
import minRouter from <span class="hljs-string">'./router'
Vue.config.productionTip = <span class="hljs-literal">false
// 注册插件
Vue.use(M<span class="hljs-keyword">inRouter)
App.mpType = <span class="hljs-string">'app'
const app = new Vue({
    ...App,
    minRouter
})
app.<span class="hljs-variable">$mount()<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>上面的代码配置中已经很像VueRouter了</p>
<p>&nbsp;</p>
<p>在MinRouter文件<em>添加</em>以下代码</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">const toString = Object.prototype.toStringfunction
isObject (value) {
<span class="hljs-built_in">return toString.call(value) === <span class="hljs-string">''
}
<span class="hljs-keyword">function isString (value) {
<span class="hljs-built_in">return toString.call(value) === <span class="hljs-string">'
'}
<span class="hljs-keyword">function isDefault (value) {
<span class="hljs-built_in">return value === void 0
}
<span class="hljs-keyword">function install (Vue) {
Vue.mixin({
    beforeCreate: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-keyword">if (!isDefault(this.<span class="hljs-variable">$options.minRouter)) {
      Vue._minRouter = this.<span class="hljs-variable">$options.minRouter
      }   
}
})
Object.defineProperty(Vue.prototype, <span class="hljs-string">'$minRouter', {
    get: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-built_in">return Vue._minRouter._router
    }
})
}
<span class="hljs-keyword">function M<span class="hljs-keyword">inRouter (options) {
<span class="hljs-keyword">if (!(this instanceof M<span class="hljs-keyword">inRouter)) {
    throw Error(<span class="hljs-string">"MinRouter是一个构造函数,应该用`new`关键字调用")
}
isDefault(options) &amp;&amp; (options = {})
this.options = options
this._router = options.routes || []
}
M<span class="hljs-keyword">inRouter.install = install
<span class="hljs-built_in">export default M<span class="hljs-keyword">inRouter<span class="copy-code-btn">复制代码</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>下面来设定openPage的参数</p>
<p>name:表示要跳转的页面</p>
<p>query:跳转页面所带的参数</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">调用方式:   openPage({name: 跳转的页面, query: {id: 123}})<span class="copy-code-btn"><br><br></span></code></pre>
<p>openPage函数如下</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash"><span class="hljs-keyword">function openPage (args) {
<span class="hljs-built_in">let {name, query = {}} = args
<span class="hljs-built_in">let queryStr = null, path
queryStr = encodeURIComponent(JSON.stringify(query))
this.<span class="hljs-variable">$minRouter.forEach(item =&gt; {
    <span class="hljs-keyword">if (item.name === name) {
      path = item.path
    }
})
<span class="hljs-built_in">return new Promise((resolve, reject) =&gt; {
    uni.navigateTo({
      url: `/<span class="hljs-variable">${path}?query=<span class="hljs-variable">${queryStr}`,
      success: resolve,
      fail: reject
    })
})
}<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></code></pre>
<div>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">this.<span class="hljs-variable">$minRouter已经在上面的代码代理过来了,不要觉得奇怪,其实就是配置路由中的routes<span class="copy-code-btn"><br></span></span></code></pre>
<p>上面的只能的路由只能使用这种方式navigateBack</p>
<p>这样肯定是不行的,你们可能会想在加一个参数去控制路由跳转方式,但是这样觉得不是很简便,既然openPage函数不能加,能不能在路由里面加了?</p>
<p>下面来修改router.js文件</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">import M<span class="hljs-keyword">inRouter from <span class="hljs-string">'./MinRouter'
// 配置路由
const router = new M<span class="hljs-keyword">inRouter({
routes: [
    {
      // 页面路径
      path: <span class="hljs-string">'pages/index/index',
      // <span class="hljs-built_in">type必须是以下的值[<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab', <span class="hljs-string">'reLaunch', <span class="hljs-string">'redirectTo']
      // 跳转方式(默认跳转方式)
      <span class="hljs-built_in">type: <span class="hljs-string">'navigateTo',
      name: <span class="hljs-string">'index'
    },
    {
      path: <span class="hljs-string">'pages/my/index',
      name: <span class="hljs-string">'my'
    }
]
})
<span class="hljs-built_in">export default router<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>openPage函数如下</p>
<p>&nbsp;<code class="hljs bash copyable" lang="bash"><span class="hljs-keyword">function openPage (args) {</span></code></p>
<pre class="hljs bash"><em id="__mceDel"><code class="hljs bash copyable" lang="bash"><span class="hljs-keyword"><span class="hljs-built_in">let name, query = {}, queryStr = null, path, <span class="hljs-built_in">type
switch (<span class="hljs-literal">true) {
    <span class="hljs-keyword">case isObject(args):
      ({name, query = {}} = args)
      <span class="hljs-built_in">break
    <span class="hljs-keyword">case isString(args):
      name = args
      <span class="hljs-built_in">break
    default:
      throw new Error(<span class="hljs-string">'参数必须是对象或者字符串')
}
<span class="hljs-keyword">if (isObject(query)) {
    queryStr = encodeURIComponent(JSON.stringify(query))
} <span class="hljs-keyword">else {
    throw new Error(<span class="hljs-string">'query数据必须是Object')
}
this.<span class="hljs-variable">$minRouter.forEach(item =&gt; {
    <span class="hljs-keyword">if (item.name === name) {
      path = item.path
      <span class="hljs-built_in">type = item.type || <span class="hljs-string">'navigateTo'
    }
})
<span class="hljs-keyword">if (![<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab', <span class="hljs-string">'reLaunch', <span class="hljs-string">'redirectTo'].includes(<span class="hljs-built_in">type)) {
    throw new Error(`name:<span class="hljs-variable">${name}里面的<span class="hljs-built_in">type必须是以下的值[<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab', <span class="hljs-string">'reLaunch', <span class="hljs-string">'redirectTo']`)
}
<span class="hljs-built_in">return new Promise((resolve, reject) =&gt; {
    uni[<span class="hljs-built_in">type]({
      url: `/<span class="hljs-variable">${path}?query=<span class="hljs-variable">${queryStr}`,
      success: resolve,
      fail: reject
    })
})
}<span class="copy-code-btn">复制代码</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></em></pre>
<p>&nbsp;</p>
</div>
<p>说了这么多还没说怎么解析路由参数了</p>
<p>下面函数是解析路由参数的</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash"><span class="hljs-keyword">function <span class="hljs-function"><span class="hljs-title">parseURL () {
const query = this.<span class="hljs-variable">$root.<span class="hljs-variable">$mp.query.query
<span class="hljs-keyword">if (query) {
    <span class="hljs-built_in">return JSON.parse(decodeURIComponent(query))
} <span class="hljs-keyword">else {
    <span class="hljs-built_in">return {}
}
}<span class="copy-code-btn">复制代码</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
</div>
<h3 data-id="heading-8">以下是完整的MinRouter代码</h3>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">const toString = Object.prototype.toString
<span class="hljs-keyword">function isObject (value) {
<span class="hljs-built_in">return toString.call(value) === <span class="hljs-string">''
}
<span class="hljs-keyword">function isString (value) {
<span class="hljs-built_in">return toString.call(value) === <span class="hljs-string">''
}
<span class="hljs-keyword">function isDefault (value) {
<span class="hljs-built_in">return value === void 0
}
<span class="hljs-keyword">function openPage (args) {
<span class="hljs-built_in">let name, query = {}, queryStr = null, path, <span class="hljs-built_in">type, isName = <span class="hljs-literal">false
switch (<span class="hljs-literal">true) {
    <span class="hljs-keyword">case isObject(args):
      ({name, query = {}} = args)
      <span class="hljs-built_in">break
    <span class="hljs-keyword">case isString(args):
      name = args
      <span class="hljs-built_in">break
    default:
      throw new Error(<span class="hljs-string">'参数必须是对象或者字符串')
}
<span class="hljs-keyword">if (isObject(query)) {
    queryStr = encodeURIComponent(JSON.stringify(query))
} <span class="hljs-keyword">else {
    throw new Error(<span class="hljs-string">'query数据必须是Object')
}
this.<span class="hljs-variable">$minRouter.forEach(item =&gt; {
    <span class="hljs-keyword">if (item.name === name) {
      path = item.path
      <span class="hljs-built_in">type = item.type || <span class="hljs-string">'navigateTo'
      isName = <span class="hljs-literal">true
    }
})
<span class="hljs-keyword">if (!isName) {
    throw new Error(`没有<span class="hljs-variable">${name}页面`)
}
<span class="hljs-keyword">if (![<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab', <span class="hljs-string">'reLaunch', <span class="hljs-string">'redirectTo'].includes(<span class="hljs-built_in">type)) {
    throw new Error(`name:<span class="hljs-variable">${name}里面的<span class="hljs-built_in">type必须是以下的值[<span class="hljs-string">'navigateTo', <span class="hljs-string">'switchTab', <span class="hljs-string">'reLaunch', <span class="hljs-string">'redirectTo']`)
}
<span class="hljs-built_in">return new Promise((resolve, reject) =&gt; {
    uni[<span class="hljs-built_in">type]({
      url: `/<span class="hljs-variable">${path}?query=<span class="hljs-variable">${queryStr}`,
      success: resolve,
      fail: reject
    })
})
}
<span class="hljs-keyword">function <span class="hljs-function"><span class="hljs-title">parseURL () {
const query = this.<span class="hljs-variable">$root.<span class="hljs-variable">$mp.query.query
<span class="hljs-keyword">if (query) {
    <span class="hljs-built_in">return JSON.parse(decodeURIComponent(query))
} <span class="hljs-keyword">else {
    <span class="hljs-built_in">return {}
}}
<span class="hljs-keyword">function install (Vue) {
Vue.mixin({
    beforeCreate: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-keyword">if (!isDefault(this.<span class="hljs-variable">$options.minRouter)) {
      Vue._minRouter = this.<span class="hljs-variable">$options.minRouter
      }
    }
})
Object.defineProperty(Vue.prototype, <span class="hljs-string">'$minRouter', {
    get: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-built_in">return Vue._minRouter._router
    }
})
Object.defineProperty(Vue.prototype, <span class="hljs-string">'$parseURL', {
    get: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-built_in">return Vue._minRouter.parseURL
    }
})
Object.defineProperty(Vue.prototype, <span class="hljs-string">'$openPage', {
    get: <span class="hljs-function"><span class="hljs-title">function () {
      <span class="hljs-built_in">return Vue._minRouter.openPage
    }
})}
<span class="hljs-keyword">function M<span class="hljs-keyword">inRouter (options) {
<span class="hljs-keyword">if (!(this instanceof M<span class="hljs-keyword">inRouter)) {
    throw Error(<span class="hljs-string">"MinRouter是一个构造函数,应该用`new`关键字调用")
}
isDefault(options) &amp;&amp; (options = {})
this.options = options
this._router = options.routes || []
}
M<span class="hljs-keyword">inRouter.install = install
M<span class="hljs-keyword">inRouter.prototype.openPage = openPage
M<span class="hljs-keyword">inRouter.prototype.parseURL = parseURL
<span class="hljs-built_in">export default M<span class="hljs-keyword">inRouter<span class="copy-code-btn">复制代码</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>使用方式如下</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">&lt;template&gt;
&lt;view class=<span class="hljs-string">"content"&gt;
    &lt;image class=<span class="hljs-string">"logo" src=<span class="hljs-string">"/static/logo.png"&gt;&lt;/image&gt;
    &lt;view&gt;
      &lt;text class=<span class="hljs-string">"title"&gt;{{title}}&lt;/text&gt;
    &lt;/view&gt;
    &lt;button @click=<span class="hljs-string">"toPage"&gt;跳转到我的页面&lt;/button&gt;
&lt;/view&gt;
&lt;/template&gt;
&lt;script&gt;
<span class="hljs-built_in">export default {
    <span class="hljs-function"><span class="hljs-title">data() {
      <span class="hljs-built_in">return {
      title: <span class="hljs-string">'index'
      }
    },
    <span class="hljs-function"><span class="hljs-title">onLoad() {
      // 解析路由参数
      console.log(this.<span class="hljs-variable">$parseURL())
    },
    methods: {
      <span class="hljs-function"><span class="hljs-title">toPage () {
      // 跳到my的页面query是传递的参数
      this.<span class="hljs-variable">$openPage({
          name: <span class="hljs-string">'my',
          query: {id: 123}
      })
      }
    }
}
&lt;/script&gt;<span class="copy-code-btn"><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<pre class="hljs bash"><code class="hljs bash copyable" lang="bash">&lt;template&gt;
&lt;view class=<span class="hljs-string">"content"&gt;
    &lt;image class=<span class="hljs-string">"logo" src=<span class="hljs-string">"/static/logo.png"&gt;&lt;/image&gt;
    &lt;view&gt;
      &lt;text class=<span class="hljs-string">"title"&gt;{{title}}&lt;/text&gt;
    &lt;/view&gt;
    &lt;button @click=<span class="hljs-string">"toPage"&gt;跳转到首页页面&lt;/button&gt;
&lt;/view&gt;
&lt;/template&gt;
&lt;script&gt;
<span class="hljs-built_in">export default {
    <span class="hljs-function"><span class="hljs-title">data() {
      <span class="hljs-built_in">return {
      title: <span class="hljs-string">'my'
      }
    },
    <span class="hljs-function"><span class="hljs-title">onLoad() {
      // 解析路由参数
      console.log(this.<span class="hljs-variable">$parseURL())
    },
    methods: {
      <span class="hljs-function"><span class="hljs-title">toPage () {
      // 跳到index的页面
      // 不传参数可以简写成如下
      this.<span class="hljs-variable">$openPage(<span class="hljs-string">'index')
      }
    }
}
&lt;/script&gt;<br><br><br>此处仅作交流学习,版权归原作者所有。<br><br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div><br><br>
来源:https://www.cnblogs.com/w-yue/p/12357838.html
頁: [1]
查看完整版本: uni-app路由的封装