91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在vue中使用 $router.push實現兩組件間值傳遞

發布時間:2021-04-20 16:12:28 來源:億速云 閱讀:270 作者:Leah 欄目:web開發

本篇文章給大家分享的是有關怎么在vue中使用 $router.push實現兩組件間值傳遞,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

vue是什么

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實現兩組件間值傳遞,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普兰县| 安塞县| 宁城县| 葵青区| 南充市| 会东县| 沂南县| 阿克苏市| 苍南县| 河池市| 巴里| 平凉市| 繁峙县| 漳平市| 东明县| 周宁县| 柘荣县| 潜山县| 开封市| 东至县| 吉安市| 宜阳县| 建昌县| 东乌珠穆沁旗| 壶关县| 毕节市| 舞钢市| 房产| 临夏县| 十堰市| 东乌珠穆沁旗| 清徐县| 礼泉县| 文成县| 垫江县| 南涧| 土默特右旗| 剑河县| 延长县| 石柱| 镇沅|