vue兩組件間值傳遞 $router.push實現方法
兩組件間傳值,可能包含多種情況,有父子組件和非父子組件,對于父子組件網上有很詳細的方法講解,但非父子組件傳值有用bus總線,還有一些其他方法,其中的使用路由跳轉的方法講解太過簡潔,難以理解。因為是公司項目,采用的是公司封裝的UI框架,但基本上還是采用vue框架,ts編寫。所以一些樣式結構可能沒有參考價值,但我會講解清楚每一部分作用,主要是路由跳轉部分的代碼實現。
首先,需求如下圖,樹狀列表每一項有一個編輯按鈕,點擊按鈕之后跳轉到另一個路由頁面,會將樹狀列表中每一項數據帶過來。
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 ,分別表示當前節(jié)點的 Node 對象和當前節(jié)點的數據。當點擊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,它們的區(qū)別簡單來說,就相當于 get 和 post ,query == get ,params == post,query 會把攜帶的參數顯示在 url 中。那query中的參數就是所需要攜帶的參數,那這一步總體來說就意味著跳轉到ListEdit這個路由頁面,并攜帶label、scene 這兩個參數。
至于其中的 info:Idata 這樣的寫法是因為ts,ts接口了解一下。
現在編輯按鈕這部分內容ok了,它確定了要跳轉的地方還有需要攜帶的參數,那么我們這個ListEdit路由頁面就應該做好準備接收人家?guī)淼膮笛?。在頁面?chuàng)建期間和路由發(fā)生改變期間,都會有一個傳值的動作,那就再created鉤子函數和監(jiān)聽路由函數中寫入代碼。
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 類似Vuex實現組件化開發(fā)的示例
本篇文章主要介紹了Vue-router 類似Vuex實現組件化開發(fā)的示例,具有一定的參考價值,有興趣的可以了解一下2017-09-09vue引入jquery時報錯 $ is not defined的問題及解決
這篇文章主要介紹了vue引入jquery時報錯 $ is not defined的問題及解決,具有很好的參考價值,希望對大家有所幫助。2022-09-09Vue自定義指令結合阿里云OSS優(yōu)化圖片的實現方法
這篇文章主要介紹了Vue自定義指令結合阿里云OSS優(yōu)化圖片的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11