小程序Behavior+form構(gòu)建復(fù)可配置表單

背景描述

由于公司項(xiàng)目的需求龄章,項(xiàng)目中會(huì)遇到各種各樣的表單,但是表單樣式幾乎都是統(tǒng)一的,考慮將所有的樣式輸入或者展示組件封裝入自定義form組件內(nèi)咳榜,form組件自己處理是否全部的必填項(xiàng)填寫(xiě)完畢,生成對(duì)應(yīng)的respontBody,檢驗(yàn)用戶的輸入負(fù)責(zé)是否符合規(guī)范爽锥,具體每個(gè)子頁(yè)面的展示和單獨(dú)的數(shù)據(jù)源處理是單獨(dú)的js去處理涌韩。由于之前做移動(dòng)端開(kāi)發(fā),做過(guò)類似的封裝所以做了一下封裝嘗試氯夷,效果還錯(cuò)臣樱。


Aug-19-2020 11-10-41.gif

代碼思路講解

1.先構(gòu)建自己的form組件

通過(guò)Behavior共用代碼路由到配置項(xiàng)js文件
        {
            'title': '車系', // 標(biāo)題
            'require': true, //是否必填項(xiàng)
            'value': -1,//組件的值后面會(huì)轉(zhuǎn)為數(shù)據(jù)
            'type': 'picker', //組件類型,標(biāo)識(shí)時(shí)那種組件
            'subType': 'seclector', //組件的次級(jí)分類
            'placeholder': '請(qǐng)選擇',
            'regular': '',//校驗(yàn)規(guī)則
            'error': '',//錯(cuò)誤提示
            'apiKey': 'dartment',//上傳接口時(shí)候的key
            'index': 5,//在表單中的下標(biāo)
            'hidden': false,//是否隱藏
            'options': [
            ],//數(shù)據(jù)源
        },
//當(dāng)個(gè)picker組件form.wxml的樣式示例
    <!-- picker組件分為date和配置項(xiàng)選擇 -->
    <view wx:elif="{{item.type === 'picker'}}">
        <view wx:if="{{item.subType === 'date'}}">
            <picker mode="date" start="{{item.startDate}}" end="{{item.endDate}}" bindchange="pickerVauleChange" id="{{index}}">
                <view class="picker-back {{item.value ? 'normal-font' : 'gray-font'}}">
                    <view class="we-picker-flex">
                        <text class="cell-title">{{item.title}}</text>
                        <i class="red-font-picker" hidden="{{item.require}}">*</I>
                    </view>
                    <view class="picker {{item.value ? 'normal-font' : 'gray-font'}}">{{item.value ? item.value :item.placeholder}}
                        <i class="csyfont csyxiayiye i"></I>
                    </view>
                </view>
            </picker>
        </view>
        <view wx:else>
            <picker mode="selector" range="{{item.options}}" bindchange="pickerVauleChange" range-key="label" id="{{index}}" value="{{item.value}}">
                <view class="picker-back">
                    <view class="we-picker-flex">
                        <text class="cell-title">{{item.title}}</text>
                        <i class="red-font-picker" hidden="{{item.require}}">*</I>
                    </view>
                    <view class="picker {{item.value > -1 ? 'normal-font' : 'gray-font'}}">{{item.options[item.value] ? item.options[item.value].label :item.placeholder}}
                        <i class="csyfont csyxiayiye i"></I>
                    </view>
                </view>
            </picker>
        </view>
    </view>

效果如下:


截屏2020-08-19 上午11.21.20.png

2.通過(guò)behaviors引入共用的代碼和共用屬性

代碼示例:

Component({
    options: {
        addGlobalClass: true // 等價(jià)于styleIsolation: 'apply-shared'
    },
    behaviors: [require('../../behavior/route/route.js')], // 引入公共代碼
    externalClasses: ['my-class'],
    properties: {
        extraData: {
            type: Object,
            value: {}, //其他的子頁(yè)面需要的數(shù)據(jù)類型
            observer: '__extraData'
        },
        saveData: {
            type: Boolean,
            value: false,
            observer: '__saveRequest'//父類發(fā)起了保存操作腮考,會(huì)順序講item.value和item.apiKey相結(jié)合并觸發(fā)提交
        },
        extraInput: {
            type: Array,
            value: [],
            observer: '__exraInput'
        }
    },
    data: {
        datasource: [],//數(shù)據(jù)源
        emptyAry: [], //所有重要的下標(biāo)
        allInput: false,//是否全部填寫(xiě)完畢
        ativeIndex: 0,
        vaild: [],//需要校驗(yàn)規(guī)則雇毫,輸入是否合法
        requestData: {} //需要默認(rèn)傳的值
    },
}

3.rout.js到底做了什么?

module.exports = Behavior({
    properties:{
        // 指定單獨(dú)操作組件的數(shù)據(jù)源的文件夾名稱
        behaviorCode:String,
        // 文件名稱
        behaviorModel:{
            type:String,
            value:''
        }
    },
    data:{
        behaviorSite:''
    },
    attached:function(){
        let code = this.data.behaviorCode || this.data.behaviorModel
        this.setData({
            behaviorSite: require('../../behavior/' + this.data.behaviorModel + '/' + code + '.js')//引入指定文件
        })
    },
    methods:{

    }
})

4.引用自定form的時(shí)候,通過(guò)behaviorCode和behaviorModel綁定操作當(dāng)前的form的js文件

<cs-form  behaviorModel="repectionnew" behaviorCode="repectionnew" bind:allInput="allslected" saveData="{{saveData}}" ></cs-form>

5.在form里面對(duì)綁定的js操作

5.1 獲取數(shù)據(jù)源

             this.data.behaviorSite.datasource(this, function (res) {
                if (res) {
                    if (!util.isNull(that.data.datasource)) {
                        util.log("form:" + 'behaviorSite.datasource')
                        that.getEmptyAry(that.data.datasource)
                    }
                } else {
                    that.getEmptyAry(that.data.datasource)
                }
            })

5.2面對(duì)需要調(diào)的單獨(dú)方法

只需要調(diào)用指定的js暴露出來(lái)的方法就好

如果有小伙伴比較感興趣的也可以留言秸仙,我也會(huì)發(fā)出對(duì)應(yīng)的脫離項(xiàng)目的demo!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘴拢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寂纪,更是在濱河造成了極大的恐慌席吴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞蛋,死亡現(xiàn)場(chǎng)離奇詭異孝冒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拟杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)庄涡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搬设,你說(shuō)我怎么就攤上這事穴店。” “怎么了拿穴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵泣洞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我默色,道長(zhǎng)球凰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮呕诉,結(jié)果婚禮上缘厢,老公的妹妹穿的比我還像新娘。我一直安慰自己甩挫,他們只是感情好贴硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著伊者,像睡著了一般夜畴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上删壮,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音兑牡,去河邊找鬼央碟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛均函,可吹牛的內(nèi)容都是我干的亿虽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苞也,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洛勉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起如迟,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤收毫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后殷勘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體此再,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年玲销,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了输拇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贤斜,死狀恐怖策吠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘩绒,我是刑警寧澤猴抹,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站草讶,受9級(jí)特大地震影響洽糟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一坤溃、第九天 我趴在偏房一處隱蔽的房頂上張望拍霜。 院中可真熱鬧,春花似錦薪介、人聲如沸祠饺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)道偷。三九已至,卻和暖如春记劈,著一層夾襖步出監(jiān)牢的瞬間勺鸦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工目木, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留换途,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓刽射,卻偏偏與公主長(zhǎng)得像军拟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子誓禁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 0懈息、雜記 0.1、在實(shí)際的開(kāi)發(fā)中摹恰,圖片資源不會(huì)存儲(chǔ)在小程序的目錄中辫继,因?yàn)樾〕绦虻拇笮〔荒艹^(guò)1MB(現(xiàn)在改為2M)...
    it筱竹閱讀 5,351評(píng)論 0 10
  • Taro 是一套遵循React語(yǔ)法規(guī)范的多端開(kāi)發(fā)解決方案,可以快速開(kāi)發(fā)微信小程序,并且支持多端開(kāi)發(fā)轉(zhuǎn)化戒祠,喜歡Rea...
    buer一w閱讀 1,888評(píng)論 0 0
  • 寫(xiě)在前面 微信小程序出來(lái)也蠻久了骇两,經(jīng)過(guò)了市場(chǎng)的考驗(yàn),已經(jīng)站穩(wěn)腳跟姜盈,融入到了各行各業(yè)低千,市場(chǎng)需求激增打來(lái)的是開(kāi)發(fā)人員的...
    月夢(mèng)佳期閱讀 1,700評(píng)論 1 1
  • web端開(kāi)發(fā)的童鞋知道,前端視圖層和服務(wù)端交互都是通過(guò)form表單進(jìn)行的馏颂,在小程序中也不例外示血。 認(rèn)識(shí)form表單 ...
    睿丶清閱讀 2,213評(píng)論 0 1
  • 久違的晴天,家長(zhǎng)會(huì)救拉。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)难审,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)亿絮。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,528評(píng)論 16 22