最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

element plus el-form雙列布局及拓展任意布局的實現(xiàn)

 更新時間:2026年02月10日 09:13:26   作者:無心使然云中漫步  
本文介紹了如何實現(xiàn)和拓展一個雙列布局的人員信息表單,并通過封裝el-form和Layout.vue組件,實現(xiàn)了更加靈活和可擴展的表單布局

1 場景

一般表單我們直接默認(rèn)布局,也就是單列布局,突然有個人員信息表單,需要雙列布局的需求,簡單實現(xiàn)并拓展下

2 思路

直接無腦div+flex布局實現(xiàn)

3 代碼

<template>
  <el-form ref="formRef" :model="formData" label-width="80px">
    <div class="form-top">
      <div class="form-top--left">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="formData.name" placeholder="請輸入姓名" />
        </el-form-item>
        <el-form-item label="年齡" prop="age">
          <el-input v-model="formData.age" placeholder="請輸入年齡" />
        </el-form-item>
        <el-form-item label="性別" prop="sex">
          <el-radio-group v-model="formData.sex">
            <el-radio :label="1">男</el-radio>
            <el-radio :label="2">女</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="郵箱" prop="email">
          <el-input v-model="formData.email" placeholder="請輸入郵箱" />
        </el-form-item>

        <el-form-item label="排序" prop="sort" placeholder="請輸入排序號">
          <el-input-number v-model="formData.sort" :min="1" />
        </el-form-item>
      </div>
      <div class="form-top--right">
        <el-form-item label="備注" prop="remark">
          <el-input
            v-model="formData.remark"
            type="textarea"
            placeholder="請輸入備注"
            maxlength="100"
            show-word-limit
            resize="none"
          />
        </el-form-item>
        <el-form-item label="說明" prop="config">
          <el-input
            v-model="formData.config"
            placeholder="請輸入說明"
            type="textarea"
            show-word-limit
            maxlength="200"
            :autosize="{ minRows: 6, maxRows: 6 }"
          />
        </el-form-item>
      </div>
    </div>
    <div class="form-bottom">
      <el-form-item>
        <el-button type="primary" @click="handleSubmit">確 定</el-button>
        <el-button type="warning" @click="handleClose">取 消</el-button>
      </el-form-item>
    </div>
  </el-form>
</template>

<script setup lang="ts">
const formRef = ref();

const formData = reactive({
  remark: "",
  age: 10,
  config: "",
  email: "",
  sex: "",
  id: null,
  name: "",
  sort: 0,
});

const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.container {
  width: 600px;
  margin-top: 100px;
  .form-top {
    display: flex;
    justify-content: space-between;
    .form-top--right {
      flex: 1;
    }
  }
  .form-bottom {
    display: flex;
    justify-content: flex-end;
  }
}
</style>

這樣的無腦實現(xiàn)實在是對不起付出的時間,不嫩復(fù)用是最大問題

4 拓展

封裝el-form,增加slot

// Form.vue

<template>
  <el-form>
    <slot></slot>
    <div class="form-top" v-if="!slot.default">
      <div class="form-top--left" v-if="slot.left">
        <slot name="left"></slot>
      </div>
      <div class="form-top--right" v-if="slot.right">
        <slot name="right"></slot>
      </div>
    </div>
    <div class="form-bottom" v-if="slot.bottom">
      <slot name="bottom"></slot>
    </div>
  </el-form>
</template>

<script setup lang="ts">
const slot = useSlots();
</script>
<style lang="scss" scoped>
.form-top {
  display: flex;
  justify-content: space-between;
  .form-top--left {
    flex: 1;
  }
  .form-top--right {
    flex: 1;
  }
}
.form-bottom {
  display: flex;
  justify-content: flex-end;
}
</style>

// index.vue

<template>
  <Form ref="formRef" :model="formData" label-width="80px">
    <template #left>
      <el-form-item label="姓名" prop="name">
        <el-input v-model="formData.name" placeholder="請輸入姓名" />
      </el-form-item>
      <el-form-item label="年齡" prop="age">
        <el-input v-model="formData.age" placeholder="請輸入年齡" />
      </el-form-item>
      <el-form-item label="性別" prop="sex">
        <el-radio-group v-model="formData.sex">
          <el-radio :label="1">男</el-radio>
          <el-radio :label="2">女</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="郵箱" prop="email">
        <el-input v-model="formData.email" placeholder="請輸入郵箱" />
      </el-form-item>

      <el-form-item label="排序" prop="sort" placeholder="請輸入排序號">
        <el-input-number v-model="formData.sort" :min="1" />
      </el-form-item>
    </template>
    <template #right>
      <el-form-item label="備注" prop="remark">
        <el-input
          v-model="formData.remark"
          type="textarea"
          placeholder="請輸入備注"
          maxlength="100"
          show-word-limit
          resize="none"
        />
      </el-form-item>
      <el-form-item label="說明" prop="config">
        <el-input
          v-model="formData.config"
          placeholder="請輸入說明"
          type="textarea"
          show-word-limit
          maxlength="200"
          :autosize="{ minRows: 6, maxRows: 6 }"
        />
      </el-form-item>
    </template>
    <template #bottom>
      <el-form-item>
        <el-button type="primary" @click="handleSubmit">確 定</el-button>
        <el-button type="warning" @click="handleClose">取 消</el-button>
      </el-form-item>
    </template>
  </Form>
</template>

<script setup lang="ts">
import Form from "./Form.vue";
const formRef = ref();

//添加人員表單
const formData = reactive({
  remark: "",
  age: 10,
  config: "",
  email: "",
  sex: "",
  id: null,
  name: "",
  sort: 0,
});

const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.form-top {
  display: flex;
  justify-content: space-between;
  .form-top--right {
    flex: 1;
  }
}
.form-bottom {
  display: flex;
  justify-content: flex-end;
}
</style>

依然不夠通用,因為布局是固定的,如果想要其他布局,要么修改Form.vue,要么重新封裝

5 繼續(xù)拓展

抽出layout,形成Layout.vue組件,拿出祖?zhèn)骷妓噑lot傳遞

// Layout.vue

<template>
  <div>
    <slot></slot>
    <div class="form-top" v-if="!slot.default">
      <div class="form-top--left" v-if="slot.left">
        <slot name="left"></slot>
      </div>
      <div class="form-top--right" v-if="slot.right">
        <slot name="right"></slot>
      </div>
    </div>
    <div class="form-bottom" v-if="slot.bottom">
      <slot name="bottom"></slot>
    </div>
  </div>
</template>

<script setup lang="ts">
const slot = useSlots();
</script>
<style lang="scss" scoped>
.form-top {
  display: flex;
  justify-content: space-between;
  .form-top--left {
    flex: 1;
  }
  .form-top--right {
    flex: 1;
  }
}
.form-bottom {
  display: flex;
  justify-content: flex-end;
}
</style>

// Form.vue

<template>
  <el-form>
    <Layout>
      <template v-for="item in Object.keys(slot)" :key="item" #[item]>
        <slot :name="item"></slot>
      </template>
    </Layout>
  </el-form>
</template>

<script setup lang="ts">
import Layout from "./Layout.vue";
const slot = useSlots();
</script>
<style lang="scss" scoped></style>

// index.vue

<template>
  <Form ref="formRef" :model="formData" label-width="80px">
    <template #left>
      <el-form-item label="姓名" prop="name">
        <el-input v-model="formData.name" placeholder="請輸入姓名" />
      </el-form-item>
      <el-form-item label="年齡" prop="age">
        <el-input v-model="formData.age" placeholder="請輸入年齡" />
      </el-form-item>
      <el-form-item label="性別" prop="sex">
        <el-radio-group v-model="formData.sex">
          <el-radio :label="1">男</el-radio>
          <el-radio :label="2">女</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="郵箱" prop="email">
        <el-input v-model="formData.email" placeholder="請輸入郵箱" />
      </el-form-item>

      <el-form-item label="排序" prop="sort" placeholder="請輸入排序號">
        <el-input-number v-model="formData.sort" :min="1" />
      </el-form-item>
    </template>
    <template #right>
      <el-form-item label="備注" prop="remark">
        <el-input
          v-model="formData.remark"
          type="textarea"
          placeholder="請輸入備注"
          maxlength="100"
          show-word-limit
          resize="none"
        />
      </el-form-item>
      <el-form-item label="說明" prop="config">
        <el-input
          v-model="formData.config"
          placeholder="請輸入說明"
          type="textarea"
          show-word-limit
          maxlength="200"
          :autosize="{ minRows: 6, maxRows: 6 }"
        />
      </el-form-item>
    </template>
    <template #bottom>
      <el-form-item>
        <el-button type="primary" @click="handleSubmit">確 定</el-button>
        <el-button type="warning" @click="handleClose">取 消</el-button>
      </el-form-item>
    </template>
  </Form>
</template>

<script setup lang="ts">
import Form from "./Form.vue";
const formRef = ref();

//添加人員表單
const formData = reactive({
  remark: "",
  age: 10,
  config: "",
  email: "",
  sex: "",
  id: null,
  name: "",
  sort: 0,
});

const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.form-top {
  display: flex;
  justify-content: space-between;
  .form-top--right {
    flex: 1;
  }
}
.form-bottom {
  display: flex;
  justify-content: flex-end;
}
</style>

6 總結(jié)

1. 布局和數(shù)據(jù)分離

2. 靈活擴展layout

  • 2.1 可以建立多個layout文件,批量引入(或動態(tài)引入)Form.vue中 ,F(xiàn)orm.vue中利用動態(tài)組件component加載各個layout文件
  • 2.2 可以建立多個layout文件,批量引入(或動態(tài)引入)LayoutIndex.vue文件中,LayoutIndex.vue文件利用動態(tài)組件component加載各個layout文件,然后Form.vue中只渲染LayoutIndex,同時通過傳參決定渲染那個layout

3. 新增layout時,只需要新增文件(所有l(wèi)ayout文件已經(jīng)被批量引入<或動態(tài)引入>),符合“開閉”原則

tip:

  • 批量引入(vite):import.meta.glob(‘./layout/**/*.vue’);
  • 動態(tài)引入:defineAsyncComponent(() => import(./components/${layoutName}.vue));

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue2.0 watch里面的 deep和immediate用法說明

    vue2.0 watch里面的 deep和immediate用法說明

    這篇文章主要介紹了vue2.0 watch里面的 deep和immediate用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • vue3+ts中定義ref變量,設(shè)置變量類型方式

    vue3+ts中定義ref變量,設(shè)置變量類型方式

    這篇文章主要介紹了vue3+ts中定義ref變量,設(shè)置變量類型方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue下的@change事件的實現(xiàn)

    vue下的@change事件的實現(xiàn)

    這篇文章主要介紹了vue下的@change事件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 使用vant-uploader上傳照片無法刪除的解決

    使用vant-uploader上傳照片無法刪除的解決

    這篇文章主要介紹了使用vant-uploader上傳照片無法刪除的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 關(guān)于在vue2中使用weixin-js-sdk的詳細步驟

    關(guān)于在vue2中使用weixin-js-sdk的詳細步驟

    公司最近有微信公眾號的需求,那么微信登錄授權(quán)和如何使用WX-JSSDk實現(xiàn)分享等等肯定是最頭疼的問題,這篇文章主要給大家介紹了關(guān)于在vue2中使用weixin-js-sdk的詳細步驟,需要的朋友可以參考下
    2024-07-07
  • vue3+vite+ts使用monaco-editor編輯器的簡單步驟

    vue3+vite+ts使用monaco-editor編輯器的簡單步驟

    因為畢設(shè)需要用到代碼編輯器,根據(jù)調(diào)研,我選擇使用monaco-editor代碼編輯器,下面這篇文章主要給大家介紹了關(guān)于vue3+vite+ts使用monaco-editor編輯器的簡單步驟,需要的朋友可以參考下
    2023-01-01
  • vue中html2canvas給指定區(qū)域添加滿屏水印

    vue中html2canvas給指定區(qū)域添加滿屏水印

    本文主要介紹了vue中html2canvas給指定區(qū)域添加滿屏水印,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • vue中組件間多種傳值方式案例詳解

    vue中組件間多種傳值方式案例詳解

    vue中每個組件都是隔離的,包括父組件和子組件,各組件之間需要數(shù)據(jù)通信,就涉及到了組件傳值,本文給大家介紹vue中組件間多種傳值方式案例,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • vant list組件滾動保留滾動條位置

    vant list組件滾動保留滾動條位置

    這篇文章主要介紹了vant list組件滾動保留滾動條位置,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue高效管理組件狀態(tài)的多種方法

    Vue高效管理組件狀態(tài)的多種方法

    在現(xiàn)代前端開發(fā)中,隨著應(yīng)用復(fù)雜度的不斷提升,組件狀態(tài)管理成為構(gòu)建高效、可維護的Vue應(yīng)用的核心問題,本文將介紹多種管理組件狀態(tài)的方法,需要的朋友可以參考下
    2025-03-03

最新評論

上饶县| 金溪县| 海淀区| 四平市| 陆川县| 乐都县| 隆尧县| 凤城市| 宜昌市| 金堂县| 宜春市| 讷河市| 广德县| 靖西县| 沙湾县| 濉溪县| 南川市| 遂溪县| 红河县| 出国| 丹江口市| 营山县| 衡南县| 黎平县| 阿瓦提县| 卓尼县| 嘉黎县| 新田县| 常德市| 吉首市| 赤峰市| 泌阳县| 堆龙德庆县| 浏阳市| 无棣县| 万全县| 林州市| 松阳县| 云浮市| 新晃| 龙海市|