国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue通過(guò)js代碼實(shí)例化組件

這篇具有很好參考價(jià)值的文章主要介紹了vue通過(guò)js代碼實(shí)例化組件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

最近在寫項(xiàng)目的一些公共組件(一些選擇器),很多個(gè)地方都需要用,所以在main.js全局聲明了,但發(fā)現(xiàn)子頁(yè)面調(diào)用還是有挺多的地方需寫。

例如,要在template實(shí)例化組件,并用ref綁定,然后在js里的methods里寫方法。

main.js 聲明全局組件

vue通過(guò)js代碼實(shí)例化組件

第一種方案

一開始想到的是用ref綁定組件,業(yè)務(wù)組件實(shí)例化公共組件,并賦予ref,然后通過(guò)這個(gè)ref綁定,直接調(diào)用公共組件的方法(為了一定能觸發(fā)方法),例如? this.$refs.xxx.open()

如果用戶在公共組件中,選擇好數(shù)據(jù)操作完成后,公共組件觸發(fā)emit方法,通過(guò)回調(diào)方法的方式通知業(yè)務(wù)組件,例如?this.$emit("getTableSelect",this.selection)

以下是相關(guān)代碼:

公共組件

<template>
  <div>
    <el-dialog
      v-loading="loading"
      :before-close="cancel"
      :close-on-click-modal="false"
      :element-loading-text="loadingText"
      :visible="dialogVisible"
      append-to-body
      title="科目選擇器"
      width="80%"
    >
      <el-form
        ref="queryForm"
        :inline="true"
        :model="queryParams"
        label-width="68px"
        size="small"
      >
        <el-form-item label="名稱" prop="name">
          <el-input
            v-model="queryParams.name"
            clearable
            placeholder="請(qǐng)輸入名稱"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="狀態(tài)" prop="status">
          <el-select
            v-model="queryParams.status"
            clearable
            placeholder="請(qǐng)選擇狀態(tài)"
          >
            <el-option
              v-for="dict in dict.type.sys_normal_disable"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            icon="el-icon-search"
            size="mini"
            type="primary"
            @click="handleQuery"
            >搜索
          </el-button>
        </el-form-item>
      </el-form>

      <el-table
        v-loading="loading"
        :data="dataList"
        @row-dblclick="rowDblclick"
        @selection-change="handleSelectionChange"
      >
        <el-table-column align="center" type="selection" width="55" />
        <el-table-column align="center" label="科目id" prop="subjectId" />
        <el-table-column align="center" label="名稱" prop="name" />
        <el-table-column align="center" label="介紹" prop="intro" />
        <el-table-column align="center" label="排序" prop="sort" />
        <el-table-column align="center" label="狀態(tài)" prop="status">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_normal_disable"
              :value="scope.row.status"
            />
          </template>
        </el-table-column>
        <el-table-column align="center" label="備注" prop="remark" />
      </el-table>
      <div slot="footer" style="text-align: center">
        <el-button type="primary" @click="submitForm">確 定</el-button>
        <el-button @click="cancel">關(guān)閉</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listSubject } from "@/api/as/subject";

export default {
  name: "TableSelect",
  dicts: ["sys_normal_disable"],
  data() {
    return {
      loading: false,
      loadingText: "數(shù)據(jù)正在處理中...",
      dialogVisible: false,
      // 查詢參數(shù)
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        name: null,
        status: null,
      },
      // 總條數(shù)
      total: 0,
      //表格數(shù)據(jù)
      dataList: [],
      //被選擇的行
      selection: [],
    };
  },

  methods: {
    /**
     * 打開窗口
     */
    open(name) {
      this.dialogVisible = true;
      this.queryParams.name = name;
      this.handleQuery();
    },
    /** 搜索按鈕操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 查詢科目列表 */
    getList() {
      this.loading = true;
      listSubject(this.queryParams).then((response) => {
        this.dataList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    //取消
    cancel() {
      this.dialogVisible = false;
      this.reset();
    },
    //確定
    submitForm(row) {
      if (row) {
        this.$emit("getTableSelect", row);
      } else if (this.selection.length > 0) {
        this.$emit("getTableSelect", this.selection);
      } else {
        this.$message.warning("請(qǐng)選擇");
        return;
      }

      this.dialogVisible = false;
      this.reset();
    },
    //重置信息
    reset() {
      this.queryParams = {
        pageNum: 1,
        pageSize: 10,
        name: null,
        status: null,
      };
      this.dataList = [];
      this.selection = [];
    },
    //表格選擇改變
    handleSelectionChange(selection) {
      this.selection = selection;
    },
    //雙擊
    rowDblclick(row) {
      this.submitForm(row);
    },
  },
};
</script>
<style lang="scss" scoped></style>

業(yè)務(wù)組件(簡(jiǎn)化)

<template>
  <div class="app-container">
    <el-input
      v-model="queryParams.name"
      clearable
      placeholder="回車搜索科目"
      @keyup.enter.native="handleTableSelect"
    />
    <table-select ref="tableSelect" @getTableSelect="getTableSelect" />
  </div>
</template>

<script>
export default {
  name: "Chapter",

  data() {
    return {
      // 遮罩層
      loading: true,
      // 查詢參數(shù)
      queryParams: {
        name: null,
      },
    };
  },

  methods: {
    //去打開窗口選擇
    handleTableSelect() {
      this.$refs.tableSelect.open(this.queryParams.name);
    },
    //獲取選擇的行
    getTableSelect(row) {
      this.queryParams.name = row.name;
    },
  },
};
</script>

效果圖

vue通過(guò)js代碼實(shí)例化組件

?

vue通過(guò)js代碼實(shí)例化組件

?

vue通過(guò)js代碼實(shí)例化組件

?

第一種方案,雖然可以使用,但業(yè)務(wù)組件若要使用,則需要正確在4個(gè)地方寫上對(duì)應(yīng)的代碼

即,1.實(shí)例化公共組件,并寫上ref和getTableSelect的事件監(jiān)聽,2.輸入框?qū)懮匣剀囀录?.回車事件里觸發(fā)公共組件的方法,4.寫getTableSelect事件監(jiān)聽的方法。

vue通過(guò)js代碼實(shí)例化組件

?

若別的小伙伴一不小心,忘記了其中一個(gè)地方(大多數(shù)都是實(shí)例化組件,或者沒寫getTableSelect事件監(jiān)聽的方法,我們程序員,ctrl+c,ctrl+v,漏拷貝一點(diǎn)點(diǎn)方法,很正常吧),則會(huì)需排查原因,相對(duì)繁瑣。

后面我想了一下,再通過(guò)百度,寫了第二種方案。

第二種方案

為了減少出現(xiàn)拷貝少問(wèn)題,我把第3步和第4步合并了(3.回車事件里觸發(fā)公共組件的方法,4.寫getTableSelect事件監(jiān)聽的方法),用Promise。

以下是相關(guān)的改動(dòng)

公共組件改動(dòng)情況

vue通過(guò)js代碼實(shí)例化組件

?

vue通過(guò)js代碼實(shí)例化組件

?業(yè)務(wù)組件改動(dòng)情況

?

vue通過(guò)js代碼實(shí)例化組件

?這樣做了之后,好處就是,觸發(fā)的事件和接收結(jié)果的方法在一起了,減少出錯(cuò)的概率,代碼也更加方便理解了。第二種方案,也是我一直用的方案,

但第二種方案,依舊要寫3個(gè)地方,即1.實(shí)例化公共組件,并寫上ref,2.輸入框?qū)懮匣剀囀录?.回車事件里觸發(fā)公共組件的方法并接收值,

這種情況下,還是有小伙伴會(huì)出現(xiàn)拷貝少的問(wèn)題(沒有實(shí)例化公共組件),我也曾想過(guò),怎么去除這個(gè)實(shí)例化的代碼,用js代碼實(shí)例化組件,但受限于個(gè)人水平不夠,我也沒想到什么好的方法解決這個(gè)問(wèn)題,所以這個(gè)問(wèn)題就一直擱置了。

直到今天(2023-9-16),我心血來(lái)潮,想看看有沒有辦法解決沒有實(shí)例化公共組件問(wèn)題,經(jīng)過(guò)長(zhǎng)時(shí)間的百度,和查看vue官方文檔,終于找到了一種可以在js代碼上實(shí)例化組件的方案,也就是現(xiàn)在的第三種方案。

第三種方案

公共組件沒有任何改變

新增一個(gè)公共的js方法

import Vue from "vue";

/**
 * 獲取表格選擇
 * @param name 搜索值
 */
export function getTableSelect(name) {
  //獲取公共里的實(shí)例
  const MyComponent = Vue.component("TableSelect");
  let myComponent = new MyComponent();
  //掛載實(shí)例
  let jbxxModal = myComponent.$mount();

  return new Promise((resolve, reject) => {
    jbxxModal
      .open(name)
      .then((row) => {
        resolve(row);
      })
      .catch((res) => {
        reject(res);
      })
      .finally(() => {
        //銷毀實(shí)例
        myComponent.$destroy();
      });
  });
}

?

main.js,新增以下代碼

vue通過(guò)js代碼實(shí)例化組件

?業(yè)務(wù)組件改動(dòng)情況

vue通過(guò)js代碼實(shí)例化組件

?通過(guò)第三種方案,別的小伙伴只需要調(diào)用公共的js方法即可,不需要實(shí)例化了組件了,大大的減少了出錯(cuò)的概率了,

現(xiàn)在只需要1.輸入框?qū)懮匣剀囀录?.回車事件里觸發(fā)公共組件的方法并接收值。

通過(guò)這次學(xué)習(xí),提升了個(gè)人的一丟丟前端知識(shí),記錄存檔,方便以后還知道怎么解決這個(gè)問(wèn)題,也方便給別的小伙伴一些參考,

若該文章幫助到了你,請(qǐng)幫忙點(diǎn)一下贊好嗎,若有更好的方案,可以評(píng)論告訴我,讓我也學(xué)習(xí)一下。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-709796.html

到了這里,關(guān)于vue通過(guò)js代碼實(shí)例化組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 項(xiàng)目實(shí)例:H3C端口鏡像 (鏡像單目的端口 鏡像多目的端口)

    項(xiàng)目實(shí)例:H3C端口鏡像 (鏡像單目的端口 鏡像多目的端口)

    一、項(xiàng)目實(shí)例 某局業(yè)務(wù)系統(tǒng)三級(jí)等保項(xiàng)目:配置只列出端口鏡像部分,其他部分及設(shè)備(略) 1.1 邊界部署兩臺(tái)防火墻做HA高可用 1.2 核心使用兩臺(tái)H3C交換機(jī)做堆疊,上聯(lián)線路分別連接防火墻(主)、防火墻(備) 1.3 下聯(lián)線路連接業(yè)務(wù)中心、安全監(jiān)察中心 1.4?IDS入侵檢測(cè)設(shè)備

    2023年04月22日
    瀏覽(25)
  • Vue前端的一些表格組件的思考

    Vue前端的一些表格組件的思考

    當(dāng)我們需要在前端中展示一些表格內(nèi)容時(shí),我們往往使用 Vue 的 table 來(lái)實(shí)現(xiàn) 當(dāng)前實(shí)現(xiàn)如下: Vue Easytable 是一個(gè)基于Vue2的表格組件,支持單元格合并、單元格編輯、多表頭固定、多列固定、列拖動(dòng)、排序、自定義列、分頁(yè)、單元格編輯、多選、條件過(guò)濾、footer 匯總等功能。

    2024年02月11日
    瀏覽(24)
  • vue獲取組件實(shí)例

    選項(xiàng)式獲取組件實(shí)例 在選項(xiàng)式中可以直接通過(guò) this 來(lái)獲取組件實(shí)例,通過(guò) this 來(lái)訪問(wèn)實(shí)例對(duì)象的各種方法 組合式中獲取組件實(shí)例 在組合式用,代碼都寫在setup函數(shù)中,無(wú)法通過(guò) this 獲取組件實(shí)例,需要通過(guò) getCurrentInstance() 方法, getCurrentInstance() 獲取的實(shí)例對(duì)象和選項(xiàng)式獲取

    2024年02月07日
    瀏覽(22)
  • vue3獲取子組件實(shí)例

    ?方法一,直接獲取 ? getCurrentInstance

    2024年02月16日
    瀏覽(21)
  • 小白最近比較閑,于是整理了一些日常使用的VUE組件

    ? ? VUE中,給 Dom 元素動(dòng)態(tài)添加樣式。 ? ? 比如判斷通過(guò)頁(yè)面?zhèn)鬟f過(guò)來(lái)的值和env文件中配置的值是否一致,來(lái)動(dòng)態(tài)添加元素的類,同時(shí)類的樣式在 Style 中已經(jīng)寫好。 ?此時(shí)動(dòng)態(tài)類名需要在 Dom 元素加載完成前添加上,否則樣式可能添加不上。 ?這種情況下可以在?? computed

    2024年02月10日
    瀏覽(23)
  • 通過(guò)實(shí)例了解vue3.3更新的特征

    通過(guò)實(shí)例了解vue3.3更新的特征

    開場(chǎng)白 準(zhǔn)備新新特征的環(huán)境 使用vite來(lái)學(xué)習(xí)vue3.3的新特征 插件 script setup + TypeScript 開發(fā)體驗(yàn)改善 解析導(dǎo)入的類型,并支持有限的復(fù)雜類型 需要注意的點(diǎn) 類型的擴(kuò)展 需要注意的點(diǎn) 通用組件-組件可以接收泛型參數(shù) 多個(gè)泛型 defineEmits的優(yōu)化--現(xiàn)在 defineEmits以前的寫法 尾聲

    2024年02月07日
    瀏覽(17)
  • Vue3 - Element Plus 表格組件 “手動(dòng)“ 取消/選中勾選列,并同步更新表格復(fù)選框 UI 狀態(tài)(el-table 表格組件中,通過(guò)代碼手動(dòng)控制某個(gè)列的選中與取消勾選,并且復(fù)選框跟著變)

    Vue3 - Element Plus 表格組件 “手動(dòng)“ 取消/選中勾選列,并同步更新表格復(fù)選框 UI 狀態(tài)(el-table 表格組件中,通過(guò)代碼手動(dòng)控制某個(gè)列的選中與取消勾選,并且復(fù)選框跟著變)

    網(wǎng)上基本上都是全部取消勾選的教程,沒有僅對(duì)單獨(dú)列操作的教程。 本文 實(shí)現(xiàn)了在 vue3 + element plus 組件庫(kù)中,對(duì) “某一個(gè)” 或 “幾個(gè)單獨(dú)” 列進(jìn)行勾選/取消(手動(dòng)操作表格復(fù)選框),并且讓表格復(fù)選框自動(dòng)同步選中狀態(tài), 完美解決刪除表格列勾選的數(shù)據(jù)后,選中和取消

    2024年02月03日
    瀏覽(131)
  • Vue獲取子組件實(shí)例對(duì)象 ref 屬性

    Vue獲取子組件實(shí)例對(duì)象 ref 屬性

    在 Vue 中推薦使用 ref 屬性獲取 DOM 元素,這種方式可以提高性能。 如果將 ref 屬性使用在組件上,那么返回的就是這個(gè)組件的實(shí)例對(duì)象。 使用方式:`p ref=\\\"xxx\\\"` 或 `Banner ref=\\\"xxx\\\"` 。 獲取方式:this.$refs.xxx 1.原生 JS 獲取 DOM 元素 【不推薦】: 2. 通過(guò) ref 屬性獲取 DOM 元素 【推薦

    2024年02月04日
    瀏覽(20)
  • Vue組件滾動(dòng)加載、懶加載功能的實(shí)現(xiàn),無(wú)限滾動(dòng)加載組件實(shí)例演示

    Vue組件滾動(dòng)加載、懶加載功能的實(shí)現(xiàn),無(wú)限滾動(dòng)加載組件實(shí)例演示

    效果圖如下: 可以看到隨著不斷的滾動(dòng),頁(yè)面組件的數(shù)量不斷的加載。 其實(shí)加載的是后端返回的數(shù)據(jù),因?yàn)樯婕半[私,沒有給顯示出來(lái)。 利用懶加載,可以防止大量渲染造成卡頓降低用戶體驗(yàn)。 頁(yè)面的動(dòng)態(tài)加載這塊可以看上一篇文章: Vue 動(dòng)態(tài)添加和刪除組件的實(shí)現(xiàn),子組

    2024年02月01日
    瀏覽(95)
  • 公司前端實(shí)習(xí)項(xiàng)目技術(shù),可以借鑒一些組件設(shè)計(jì)思路及基本代碼邏輯,應(yīng)屆生來(lái)!

    1.跳轉(zhuǎn) 2.請(qǐng)求 1.mounted() 1.從登陸界面開始,通過(guò)Common.httpRequest()發(fā)送請(qǐng)求,經(jīng)過(guò)Common.forward()跳轉(zhuǎn)傳參,在mounted或者created生命周期中通過(guò)common.getActivePageStack()獲取到跳轉(zhuǎn)所傳參數(shù),這樣就可以根據(jù)id或者其他唯一數(shù)據(jù)發(fā)送請(qǐng)求查詢所需數(shù)據(jù) 1.DialogInfo 1.用法 先引入組件 在

    2024年02月21日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包