您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在vue中使用 $router.push實現兩組件間值傳遞,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Vue是一套用于構建用戶界面的漸進式JavaScript框架,Vue與其它大型框架的區別是,使用Vue可以自底向上逐層應用,其核心庫只關注視圖層,方便與第三方庫和項目整合,且使用Vue可以采用單文件組件和Vue生態系統支持的庫開發復雜的單頁應用。
vue文件部分:
<tree :data="dataList" node-key="id" default-expand-all :expand-on-click-node="false"> <span class="custom-tree-node" slot-scope="{ node, data }" :class="$style.list"> <span :class="$style.listText">{{ node.label }}</span> <span :class="$style.listBtn"> <button :class="$style.btn" type="text" size="mini" @click="() => edit(data)"> </button> </span> </span> </tree> <router-view></router-view>
這是封裝好的樹狀列表,使用 scoped slot 會傳入兩個參數 node 和 data ,分別表示當前節點的 Node 對象和當前節點的數據。當點擊button會路由跳轉頁面顯示在 <router-view>中。
那我們先來看一下ts中edit這個方法是怎么寫的。
edit(info: Idata) { this.$router.push({ name: `ListEdit`, query: { label: info.label, scene: info.scene, }, }); },
終于看到主角 $router.push ,它會帶兩個參數,name表示即將跳轉到的路由名字,還有一個參數可以是query,也可以是params,它們的區別簡單來說,就相當于 get 和 post ,query == get ,params == post,query 會把攜帶的參數顯示在 url 中。那query中的參數就是所需要攜帶的參數,那這一步總體來說就意味著跳轉到ListEdit這個路由頁面,并攜帶label、scene 這兩個參數。
至于其中的 info:Idata 這樣的寫法是因為ts,ts接口了解一下。
現在編輯按鈕這部分內容ok了,它確定了要跳轉的地方還有需要攜帶的參數,那么我們這個ListEdit路由頁面就應該做好準備接收人家帶來的參數呀。在頁面創建期間和路由發生改變期間,都會有一個傳值的動作,那就再created鉤子函數和監聽路由函數中寫入代碼。
created() { const {label= "", scene= ""} = this.$route.query; this.form = { name: label.toString(), initScene: scene.toString(), }; }, watch: { $route(to, from) { if (to.path === "/list/listEdit") { const {label= "", scene= ""} = to.query; this.form = { name: label.toString(), initScene: scene.toString(), }; } }, },
我感覺這樣半截的代碼實在難以說明,name、initScene都是前面定義的,還是放出完整代碼體驗一下吧。
樹狀列表編輯按鈕vue文件部分:
<template> <tree :data="dataList" node-key="id" default-expand-all :expand-on-click-node="false"> <span class="custom-tree-node" slot-scope="{ node, data }" :class="$style.list"> <span :class="$style.listText">{{ node.label }}</span> <span :class="$style.listBtn"> <button :class="$style.btn" type="text" size="mini" @click="() => edit(data)"> </button> </span> </span> </tree> <router-view></router-view> </template> <script src="./index.ts" lang="ts"></script>
樹狀列表編輯按鈕ts文件部分:
import Vue from "vue"; interface Idata { id: string; label: string; scene: string; children?: Idata[]; } export default Vue.extend({ data() { const data: Idata[] = [{ id: "1", label: "1", scene: "場景1", }, { id: "2", label: "2", scene: "場景2", children: [{ id: "4", label: "2-1", scene: "場景1", }], }, { id: "3", label: "3", scene: "場景2", }]; return { data, dataList: JSON.parse(JSON.stringify(data)), }; }, methods: { edit(info: Idata) { this.$router.push({ name: `VisListEdit`, query: { label: info.label, scene: info.scene, }, }); }, }, });
這里,ts接口定義可以遞歸實現,children的類型定義還是Idata,就可以直接自我調用。
ListEdit 路由頁面vue文件部分:
<template> <div> <form :model="form" ref="form"> <form-item :label="目錄名稱"> <input v-model="form.name"></input> </form-item> <form-item :label="選擇場景"> <select v-model="form.initScene" placeholder="請輸入場景"> <option v-for="item in sceneOption" :key="item.id" :label="item.name" :value="item.id"> </option> </select> </form-item> </form> <div> <button type="primary" @click="submitForm">保存</button> </div> </div> </template> <script src="./index.ts" lang="ts"></script>
ListEdit 路由頁面ts文件部分:
import Vue from "vue"; interface Iscenes { id: string; name: string; selected: boolean; } export default Vue.extend({ data() { const sceneOption: Iscenes[] = [{ id: "1", name: "場景1", selected: false, },{ id: "2", name: "場景2", selected: false, },{ id: "3", name: "場景3", selected: false, }]; return { form: { name: "", initScene: "", }, sceneOption, }; }, created() { const {label= "", scene= ""} = this.$route.query; this.form = { name: label.toString(), initScene: scene.toString(), }; }, watch: { $route(to, from) { if (to.path === "/list/listEdit") { const {label= "", scene= ""} = to.query; this.form = { name: label.toString(), initScene: scene.toString(), }; } }, }, methods: { submitForm() { console.log("test"); } }, });
最后,再來看一下,路由部分的配置:
import ListDetail from "../views/list-detail/index.vue"; import List from "../views/list/index.vue"; import { MenuConfig } from "./index"; export const listRouter: MenuConfig = { path: "/list", component: List, title: "目錄管理", key: "list", name: "list", hasPermission: true, subShow: false, children: [{ path: "listEdit", title: "編輯目錄", hasPermission: true, name: "ListEdit", key: "ListEdit", component: ListDetail, }], };
以上就是怎么在vue中使用 $router.push實現兩組件間值傳遞,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。