Vue動(dòng)態(tài)表單的應(yīng)用詳解
概述
后臺(tái)管理系統(tǒng)里面有非常多的表單需求,我們希望能夠通過(guò)寫(xiě)一個(gè)json格式的數(shù)據(jù),通過(guò)vue的循環(huán)動(dòng)態(tài)地去渲染動(dòng)態(tài)表單。并且能夠在外部得到渲染出來(lái)的表單數(shù)據(jù),從而做一個(gè)入庫(kù)操作。
v-model的理解
vue-model相當(dāng)于給表單元素傳遞一個(gè)value,外部監(jiān)聽(tīng)input事件。所以我們自己封裝表單組件的時(shí)候也是可以傳遞一個(gè)value值,監(jiān)聽(tīng)input事件獲取輸入的值。
<input type="text" v-model="thing"> <!-- 等同于 --> <input type="text" v-bind:value="thing" v-on:input="thing = $event.target.value">
業(yè)務(wù)應(yīng)用場(chǎng)景
最近在寫(xiě)一個(gè)在線教育平臺(tái),發(fā)現(xiàn)在后臺(tái)添加課程的時(shí)候,每個(gè)課程所需要的參數(shù)不一樣(有的課程沒(méi)有特殊參數(shù)),使用固定表單在這個(gè)場(chǎng)景下使用很不優(yōu)雅,而且工作量巨大。為了解決這個(gè)問(wèn)題,我們可以在添加課程的時(shí)候動(dòng)態(tài)的展示出課程分類(lèi)表單所需要的參數(shù),獲取輸入的課程參數(shù),構(gòu)造數(shù)據(jù),進(jìn)行入庫(kù)操作。
通過(guò)組件展示分類(lèi)
<!-- 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 { //聲明名稱(chēng) name: "Reply", props: ['data'], //聲明組件 components: {}, //聲明變量 data() { return { fid: 0, } }, //自定義過(guò)濾器 filters: { myfilter: function (value) { value = value.slice(0, 3); return value + "********"; } }, //初始化方法 mounted() { }, //聲明方法 methods: { //點(diǎn)選分類(lèi)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"); } //首先將當(dāng)前元素高亮顯示 var mydiv = document.getElementById(fid); //動(dòng)態(tài)添加高亮類(lèi)選擇器 mydiv.classList.add("bg"); } } } </script> <style> ul { padding-left: 10rem; list-style: none; } .bg { background: orange; color: white; } </style>
采用第三方組件監(jiān)聽(tīng)分類(lèi)的ID
<!--bus.js--> import Vue from 'vue' export default new Vue();
課程添加頁(yè)面
<template> <div> <heads></heads> <h1>課程提交頁(yè)面</h1> <reply :data="mydata"/> <van-cell-group> <van-field label="課程標(biāo)題" v-model="title"/> <van-field label="課程描述" v-model="desc" rows="5" type="textarea"/> <van-field label="課程價(jià)格" 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> //導(dǎo)入其他組件 import bus from './bus.js'; import reply from "./reply"; import heads from "./heads"; export default { //聲明組件 components: { 'reply': reply, 'heads': heads, }, //構(gòu)造方法 created() { //監(jiān)聽(tīng) 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)保存過(guò)課程了,無(wú)法再次選擇分類(lèi)"); return false; } }); }, //聲明變量 data() { return { //數(shù)據(jù) mydata: {}, //課程分類(lèi)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ā)送請(qǐng)求 this.axios.get( 'http://localhost:5000/catelist/').then((result) => { console.log(result); // 聲明根節(jié)點(diǎn) 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>
小結(jié)
簡(jiǎn)單的來(lái)說(shuō),就是我們?cè)谔砑诱n程的時(shí)候選擇分類(lèi),會(huì)以表單的形式動(dòng)態(tài)展示出該分類(lèi)下面我們必傳的參數(shù),用戶(hù)添加課程,提高效率。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue 動(dòng)態(tài)表單開(kāi)發(fā)方法案例詳解
- 使用Vue生成動(dòng)態(tài)表單
- 策略模式實(shí)現(xiàn) Vue 動(dòng)態(tài)表單驗(yàn)證的方法
- 詳解Vue+Element的動(dòng)態(tài)表單,動(dòng)態(tài)表格(后端發(fā)送配置,前端動(dòng)態(tài)生成)
- 基于Vue+elementUI實(shí)現(xiàn)動(dòng)態(tài)表單的校驗(yàn)功能(根據(jù)條件動(dòng)態(tài)切換校驗(yàn)格式)
- vue構(gòu)建動(dòng)態(tài)表單的方法示例
- vue2 中如何實(shí)現(xiàn)動(dòng)態(tài)表單增刪改查實(shí)例
- Vue+ElementUI實(shí)現(xiàn)表單動(dòng)態(tài)渲染、可視化配置的方法
- Vue+Element實(shí)現(xiàn)動(dòng)態(tài)生成新表單并添加驗(yàn)證功能
- vue+element實(shí)現(xiàn)動(dòng)態(tài)加載表單
相關(guān)文章
vue中img src 動(dòng)態(tài)加載本地json的圖片路徑寫(xiě)法
這篇文章主要介紹了vue中的img src 動(dòng)態(tài)加載本地json的圖片路徑寫(xiě)法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04使用vue項(xiàng)目配置多個(gè)代理的注意點(diǎn)
這篇文章主要介紹了使用vue項(xiàng)目配置多個(gè)代理的注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用
這篇文章主要給大家介紹了關(guān)于Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue CLI3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06編寫(xiě)Vue項(xiàng)目,如何給數(shù)組的第一位添加對(duì)象數(shù)據(jù)
這篇文章主要介紹了編寫(xiě)Vue項(xiàng)目,如何給數(shù)組的第一位添加對(duì)象數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue、uniapp實(shí)現(xiàn)組件動(dòng)態(tài)切換效果
在Vue中,通過(guò)使用動(dòng)態(tài)組件,我們可以實(shí)現(xiàn)組件的動(dòng)態(tài)切換,從而達(dá)到頁(yè)面的動(dòng)態(tài)展示效果,這篇文章主要介紹了vue、uniapp實(shí)現(xiàn)組件動(dòng)態(tài)切換,需要的朋友可以參考下2023-10-10解決iView Table組件寬度只變大不變小的問(wèn)題
這篇文章主要介紹了解決iView Table組件寬度只變大不變小的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11vue v-viewer組件使用示例詳解(v-viewer輪播圖)
這篇文章主要介紹了vue v-viewer組件使用示例詳解(v-viewer輪播圖),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Vue使用axios引起的后臺(tái)session不同操作
這篇文章主要介紹了Vue使用axios引起的后臺(tái)session不同操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08詳解vue開(kāi)發(fā)中調(diào)用微信jssdk的問(wèn)題
這篇文章主要介紹了vue開(kāi)發(fā)中調(diào)用微信jssdk的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04