Vue動態(tài)表單的應用詳解
概述
后臺管理系統(tǒng)里面有非常多的表單需求,我們希望能夠通過寫一個json格式的數(shù)據(jù),通過vue的循環(huán)動態(tài)地去渲染動態(tài)表單。并且能夠在外部得到渲染出來的表單數(shù)據(jù),從而做一個入庫操作。
v-model的理解
vue-model相當于給表單元素傳遞一個value,外部監(jiān)聽input事件。所以我們自己封裝表單組件的時候也是可以傳遞一個value值,監(jiān)聽input事件獲取輸入的值。
<input type="text" v-model="thing"> <!-- 等同于 --> <input type="text" v-bind:value="thing" v-on:input="thing = $event.target.value">
業(yè)務應用場景
最近在寫一個在線教育平臺,發(fā)現(xiàn)在后臺添加課程的時候,每個課程所需要的參數(shù)不一樣(有的課程沒有特殊參數(shù)),使用固定表單在這個場景下使用很不優(yōu)雅,而且工作量巨大。為了解決這個問題,我們可以在添加課程的時候動態(tài)的展示出課程分類表單所需要的參數(shù),獲取輸入的課程參數(shù),構造數(shù)據(jù),進行入庫操作。
通過組件展示分類
<!-- reply.vue --> <template> <div> <li> <div v-if="data.id != 0" @click="getfid(data.id)" :id="data.id"> {{ data.name }}</div> <ul v-if="data.children && data.children.length > 0"> <Reply v-for="child in data.children" :key="child.id" :data="child"/> </ul> </li> </div> </template> <script> import bus from './bus.js'; export default { //聲明名稱 name: "Reply", props: ['data'], //聲明組件 components: {}, //聲明變量 data() { return { fid: 0, } }, //自定義過濾器 filters: { myfilter: function (value) { value = value.slice(0, 3); return value + "********"; } }, //初始化方法 mounted() { }, //聲明方法 methods: { //點選分類id getfid: function (fid) { this.fid = fid; //console.log(this.fid); bus.$emit("msg", fid); localStorage.setItem("fid", this.fid); //取消所有高亮 var divs = document.getElementsByClassName("bg"); //遍歷選擇器 for (var i = divs.length - 1; i >= 0; i--) { //取消高亮 divs[i].classList.remove("bg"); } //首先將當前元素高亮顯示 var mydiv = document.getElementById(fid); //動態(tài)添加高亮類選擇器 mydiv.classList.add("bg"); } } } </script> <style> ul { padding-left: 10rem; list-style: none; } .bg { background: orange; color: white; } </style>
采用第三方組件監(jiān)聽分類的ID
<!--bus.js--> import Vue from 'vue' export default new Vue();
課程添加頁面
<template> <div> <heads></heads> <h1>課程提交頁面</h1> <reply :data="mydata"/> <van-cell-group> <van-field label="課程標題" v-model="title"/> <van-field label="課程描述" v-model="desc" rows="5" type="textarea"/> <van-field label="課程價格" v-model="price"/> <div v-for="(value,key,index) in params"> <van-field :label="key" v-model="info[key]"/> </div> <van-button color="gray" @click="addcourse">保存課程</van-button> </van-cell-group> </div> </template> <script> //導入其他組件 import bus from './bus.js'; import reply from "./reply"; import heads from "./heads"; export default { //聲明組件 components: { 'reply': reply, 'heads': heads, }, //構造方法 created() { //監(jiān)聽 bus.$on('msg', target => { console.log(target); this.fid = target; if (this.cid === 0) { this.get_cate(this.fid) } else { this.$toast.fail("您已經(jīng)保存過課程了,無法再次選擇分類"); return false; } }); }, //聲明變量 data() { return { //數(shù)據(jù) mydata: {}, //課程分類id fid: localStorage.getItem("fid"), title: "", price: "", desc: "", cid: 0, videos: [], videosrc: "", params: {}, info: {} } }, //初始化方法 mounted() { this.get_data(); }, //聲明方法 methods: { get_cate(fid) { this.axios.get('http://localhost:5000/getcate/', {params: {'fid': fid}}).then(result => { var myparams = result.data.params; if (myparams === '') { myparams = null } myparams = JSON.parse(myparams) this.params = myparams for (var key in this.params) { this.$set(this.info, key, '') } console.log(this.info) }) }, //添加課程 addcourse: function () { var lists = []; for (var key in this.info) { lists.push({'key': key, 'value': this.info[key], 'label': this.params[key]}) } var list_str = JSON.stringify(lists) var data_post = { fid: this.fid, title: this.title, desc: this.desc, price: this.price, id: localStorage.getItem("user_id"), } if (lists.length > 0) { data_post = { fid: this.fid, title: this.title, desc: this.desc, price: this.price, id: localStorage.getItem("user_id"), params:list_str } } this.axios.post( 'http://localhost:5000/addcourse/', this.qs.stringify(data_post)).then((result) => { if (result.data.code === 200) { this.$toast.success('課程添加成功'); this.cid = result.data.cid; } else { this.$toast.fail(result.data.msg); } }); }, //獲取數(shù)據(jù) get_data: function () { //發(fā)送請求 this.axios.get( 'http://localhost:5000/catelist/').then((result) => { console.log(result); // 聲明根節(jié)點 var mytree = {'id': 0, name: ""}; mytree['children'] = result.data; this.mydata = mytree; console.log(this.mydata); }); } } } </script> <style scoped> ul { padding-left: 10rem; list-style: none; } </style>
小結
簡單的來說,就是我們在添加課程的時候選擇分類,會以表單的形式動態(tài)展示出該分類下面我們必傳的參數(shù),用戶添加課程,提高效率。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- vue 動態(tài)表單開發(fā)方法案例詳解
- 使用Vue生成動態(tài)表單
- 策略模式實現(xiàn) Vue 動態(tài)表單驗證的方法
- 詳解Vue+Element的動態(tài)表單,動態(tài)表格(后端發(fā)送配置,前端動態(tài)生成)
- 基于Vue+elementUI實現(xiàn)動態(tài)表單的校驗功能(根據(jù)條件動態(tài)切換校驗格式)
- vue構建動態(tài)表單的方法示例
- vue2 中如何實現(xiàn)動態(tài)表單增刪改查實例
- Vue+ElementUI實現(xiàn)表單動態(tài)渲染、可視化配置的方法
- Vue+Element實現(xiàn)動態(tài)生成新表單并添加驗證功能
- vue+element實現(xiàn)動態(tài)加載表單
相關文章
vue中img src 動態(tài)加載本地json的圖片路徑寫法
這篇文章主要介紹了vue中的img src 動態(tài)加載本地json的圖片路徑寫法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04編寫Vue項目,如何給數(shù)組的第一位添加對象數(shù)據(jù)
這篇文章主要介紹了編寫Vue項目,如何給數(shù)組的第一位添加對象數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04vue、uniapp實現(xiàn)組件動態(tài)切換效果
在Vue中,通過使用動態(tài)組件,我們可以實現(xiàn)組件的動態(tài)切換,從而達到頁面的動態(tài)展示效果,這篇文章主要介紹了vue、uniapp實現(xiàn)組件動態(tài)切換,需要的朋友可以參考下2023-10-10vue v-viewer組件使用示例詳解(v-viewer輪播圖)
這篇文章主要介紹了vue v-viewer組件使用示例詳解(v-viewer輪播圖),本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02