成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Vue渲染可配置表單--記一次問卷平臺項(xiàng)目

mcterry / 3109人閱讀

摘要:相當(dāng)于可以編輯問卷并提供問卷展示,數(shù)據(jù)統(tǒng)計(jì)的這么一個(gè)平臺。極大的節(jié)省了需要進(jìn)行表單樣式修改的時(shí)間,同時(shí),讓動態(tài)渲染表單成為一件可能且容易的事情。表單動態(tài)渲染剛好在項(xiàng)目之前,有過一次動態(tài)配置表單的嘗試通過字段自動生成表單及驗(yàn)證。

近幾天來了個(gè)緊急項(xiàng)目,想要做一個(gè)內(nèi)部版本的問卷星。相當(dāng)于可以編輯問卷并提供問卷展示,數(shù)據(jù)統(tǒng)計(jì)的這么一個(gè)平臺。整個(gè)項(xiàng)目耗時(shí)不長,本著積淀和積累的原則,將過程中的思路和收獲進(jìn)行一下沉淀。由于公司原因,代碼尚未開源。

不過沉淀了個(gè)動態(tài)配置表單的嘗試: github,用于后臺快速開發(fā)表單等需求,搭配element-ui進(jìn)行使用,同時(shí)可通過后臺進(jìn)行配置生成表單等。

功能和效果

問卷編輯功能大概需要一下幾點(diǎn):

根據(jù)不同題型添加問題

區(qū)分問題的必選性

問題排序,刪除,復(fù)制功能

選擇題的選項(xiàng)編輯,排序,刪除功能

問卷渲染

生成問卷二維碼

效果


or
預(yù)覽

技術(shù)方案 Vue + VueRouter + ElementUI

使用element進(jìn)行后臺以及問卷表單渲染是再合適不過的了。極大的節(jié)省了需要進(jìn)行表單樣式修改的時(shí)間,同時(shí),讓動態(tài)渲染表單成為一件可能且容易的事情。

表單動態(tài)渲染

剛好在項(xiàng)目之前,有過一次動態(tài)配置表單的嘗試: github 通過字段自動生成表單及驗(yàn)證。但此時(shí)的數(shù)據(jù)格式相當(dāng)于在后臺已經(jīng)確定好的,針對可變切頻繁變動的表單結(jié)構(gòu),確定數(shù)據(jù)結(jié)構(gòu)如下:

數(shù)據(jù)結(jié)構(gòu)
data: {
  title: 問卷名稱
  desc: 問卷描述
  questionList: [
    {
      type: 問題類型,
      label: 問題描述,
      required: 必選性,
      options: [ //選項(xiàng)
        {
          label: 選項(xiàng)內(nèi)容,
          value: 選項(xiàng)值
        }
        ...
      ] 
    }
    ...
  ]
}
表單渲染

最簡單的 v-if 模式來滿足我們的需求,之前有想過使用is進(jìn)行渲染,但是不同表單配置項(xiàng)相差很大,很難進(jìn)行通用。因此采用類似以下這種方式,配置詳情可見element官網(wǎng)。


很簡單就可以將表單根據(jù)配置渲染出來啦:

實(shí)現(xiàn)過程

思路理清楚了,就可以動手實(shí)踐啦!

添加問題

首先,我需要各個(gè)問題的基本配置模板,以便于每次直接向questionList中直接添加相應(yīng)的內(nèi)容,為了方便存儲及使用,將其放在store中,當(dāng)

const state = {
  baseSet: {
    radio: {
      type: "radio",
      label: "單選題",
      required: true,
      options: [...]
    },
    checkbox: ...
    input: ...
  }
}

//添加問題時(shí),直接push進(jìn)數(shù)組即可
const mutations = [
  //添加問題
  ADDQUESTIONLIST(state, data) {
    state.qss.questionList.push(data);
  }
]

//添加問題方法
addQuestion(type) {
  this.addQuestionList(this. baseSet[type]);
},
注意

使用getter獲取到我們對應(yīng)的baseSet對象時(shí),此對象為引用類型,并且,對象的屬性,如options也同樣為引用類型。我們?nèi)舨贿M(jìn)行處理,則會出現(xiàn),創(chuàng)建兩個(gè)相同類型的問題時(shí),對其中某一問題選項(xiàng)進(jìn)行修改,另一個(gè)選項(xiàng)也會進(jìn)行修改。 因此我們需要對base對象進(jìn)行簡單的拷貝(只進(jìn)行到數(shù)組內(nèi)容即可)

export const clone = function(obj) {
  var newObj = {};

  for (let key in obj) {
    var target = obj[key];

    if (Object.prototype.toString.call(target) === "[object Object]") {
      newObj[key] = clone(target);
    } else {
      if (Object.prototype.toString.call(target) === "[object Array]") {
        newObj[key] = target.slice(0);
      } else {
        newObj[key] = target;
      }
    }
  }

  return newObj;
}

addQuestion(type) {
  this.addQuestionList(clone(this. baseSet[type]));
},
排序/刪除/復(fù)制

這三點(diǎn)基本就是簡單的數(shù)組操作啦,此時(shí)的問題數(shù)據(jù)依舊是引用類型,直接對引用數(shù)組進(jìn)行操作即可。簡單的上移,下移排序,使用splice即可實(shí)現(xiàn)。其實(shí)這三點(diǎn)都是用splice實(shí)現(xiàn)的哈。

deleteQuestion(index) {
  this.data.questionList.splice(index, 1);
},

copyQuestion(index) {
  let list = this.data.questionList;
  //復(fù)制時(shí),同樣需要對引用對象進(jìn)行深拷貝
  list.splice(index, 1, list[index], clone(list[index]));
},

moveQuestion(index, direct) {
  let list = this.data.questionList;

  if(direct === "up") {
    if(index < 1) {
      this.$toast("已經(jīng)是第一項(xiàng)!");
      return;
    }

    list.splice(index - 1, 2, list[index], list[index - 1]);
  } else {
    if(index >= list.length - 1) {
      this.$toast("已經(jīng)是最后一項(xiàng)!");
      return;
    }

    list.splice(index, 2, list[index + 1], list[index]);
  }
}
生成二維碼

使用qrcode.js,感謝大佬們?yōu)樾≥厒冊斐鲞@么多好用的輪子,讓我們站在巨人的肩膀上前行!

其他點(diǎn) 對于Vuex,使用computed獲取getters or state,如何配合v-model使用?

我們都知道,針對Vue2.0后,使用computed獲取getters or state,而針對計(jì)算屬性,我們是無法進(jìn)行寫操作的,像這樣

computed: {
  ...mapState({
    qss: state => state.qss,
    base: state => state.base
  })
},

//以下代碼是無效的
this.qss = 2;

因此,我們更無法將qss屬性直接綁定在v-model上,很是苦惱。同事的一般處理方式是在data中書寫相同的屬性,在路由進(jìn)入時(shí)對其進(jìn)行初始化,當(dāng)其修改時(shí)再寫回store。這樣寫起來未免有點(diǎn)麻煩且不妥當(dāng)。那么,該如何解決呢?

其實(shí)很簡單,可以交給父組件呀。

我們常常會聽到一個(gè)詞,單向數(shù)據(jù)流,大概意思就是讓數(shù)據(jù)單一方向流動,我們只對數(shù)據(jù)源進(jìn)行修改,再讓數(shù)據(jù)從數(shù)據(jù)源依次流動到子組件進(jìn)行UI渲染。

其實(shí)就像我們使用ajax獲取數(shù)據(jù)時(shí),統(tǒng)一交給父組件一樣,我們將統(tǒng)一獲取到的數(shù)據(jù),使用props進(jìn)行向下分發(fā)即可,使用vuex亦是如此。子組件值進(jìn)行對應(yīng)值的修改。而針對props,v-model可以很方便的對其進(jìn)行修改了。當(dāng)然這些只是我的一點(diǎn)理解,如果有異議,可以一起討論哈。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82509.html

相關(guān)文章

  • Vue.js實(shí)現(xiàn)一個(gè)簡易問卷平臺(項(xiàng)目中遇到的問題總結(jié))

    摘要:項(xiàng)目地址源碼地址預(yù)覽地址沒有做響應(yīng)式,請?jiān)陔娔X上打開使用了我自制的日歷組件初學(xué)時(shí)做的,有些糙任務(wù)描述參考設(shè)計(jì)圖實(shí)現(xiàn)一個(gè)簡易版的問卷管理系統(tǒng),有如下功能問卷管理列表有一個(gè)頭部可以顯示,不需要實(shí)現(xiàn)登錄等操作問卷管理列表頁面默認(rèn)為首頁有一個(gè)表格 項(xiàng)目地址 源碼地址 預(yù)覽地址(沒有做響應(yīng)式,請?jiān)陔娔X上打開) 使用了我自制的日歷組件(初學(xué)vue時(shí)做的,有些糙)calendar-input 任...

    Scott 評論0 收藏0
  • Vue.js實(shí)現(xiàn)一個(gè)簡易問卷平臺(項(xiàng)目中遇到的問題總結(jié))

    摘要:項(xiàng)目地址源碼地址預(yù)覽地址沒有做響應(yīng)式,請?jiān)陔娔X上打開使用了我自制的日歷組件初學(xué)時(shí)做的,有些糙任務(wù)描述參考設(shè)計(jì)圖實(shí)現(xiàn)一個(gè)簡易版的問卷管理系統(tǒng),有如下功能問卷管理列表有一個(gè)頭部可以顯示,不需要實(shí)現(xiàn)登錄等操作問卷管理列表頁面默認(rèn)為首頁有一個(gè)表格 項(xiàng)目地址 源碼地址 預(yù)覽地址(沒有做響應(yīng)式,請?jiān)陔娔X上打開) 使用了我自制的日歷組件(初學(xué)vue時(shí)做的,有些糙)calendar-input 任...

    kbyyd24 評論0 收藏0
  • 一次Vue項(xiàng)目優(yōu)化及思路

    摘要:記錄一個(gè)前端項(xiàng)目優(yōu)化的路程,效果如上圖。第二步優(yōu)化結(jié)果再次運(yùn)行查看項(xiàng)目打包情況可以看到項(xiàng)目體積已經(jīng)優(yōu)化到,中也看不到的蹤影了。本文主要想提供一些優(yōu)化思路及手段,即如何定位通過,查看頁面加載時(shí)間問題,然后再解決這些問題。 showImg(https://segmentfault.com/img/bVbq282?w=381&h=384); 記錄一個(gè)前端項(xiàng)目優(yōu)化的路程,效果如上圖。 接下來我...

    keithxiaoy 評論0 收藏0
  • 一次Vue項(xiàng)目優(yōu)化及思路

    摘要:記錄一個(gè)前端項(xiàng)目優(yōu)化的路程,效果如上圖。第二步優(yōu)化結(jié)果再次運(yùn)行查看項(xiàng)目打包情況可以看到項(xiàng)目體積已經(jīng)優(yōu)化到,中也看不到的蹤影了。本文主要想提供一些優(yōu)化思路及手段,即如何定位通過,查看頁面加載時(shí)間問題,然后再解決這些問題。 showImg(https://segmentfault.com/img/bVbq282?w=381&h=384); 記錄一個(gè)前端項(xiàng)目優(yōu)化的路程,效果如上圖。 接下來我...

    nanchen2251 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<