Vue開(kāi)發(fā)問(wèn)題總結(jié)

用vue開(kāi)發(fā)了一段時(shí)間炬守,針對(duì)團(tuán)隊(duì)中出現(xiàn)的問(wèn)題做一下記錄。文字表達(dá)能力不太好剂跟,大家將就看下减途,問(wèn)題大概如下:

  • v-cloak屬性
  • 數(shù)組更新問(wèn)題
  • 對(duì)象更新問(wèn)題
  • render函數(shù)使用

1. v-cloak 屬性

vue的模板建議都加上v-cloak屬性,網(wǎng)頁(yè)加載的時(shí)候曹洽,先加載html鳍置,再加載js,網(wǎng)絡(luò)不太好的情況下送淆,頁(yè)面會(huì)看到?jīng)]有渲染的模板税产,不太美觀。

假如用戶的網(wǎng)絡(luò)不太好,2s才把js文件下載下來(lái)砖第,這里用setTimeout來(lái)模擬
沒(méi)加v-cloak屬性的代碼
沒(méi)加v-cloak屬性的代碼運(yùn)行效果
下面是加了`v-cloak`的代碼撤卢,在模板元素上加`v-cloak`屬性,同時(shí)加一個(gè)樣式梧兼,
[v-cloak]{
    display:none;
}
沒(méi)有渲染的模板直接不顯示給用戶放吩,當(dāng)模板渲染后,vue會(huì)把v-cloak屬性刪除羽杰,所以下面代碼運(yùn)行效果是渡紫,前2s頁(yè)面是空白的,2s后才顯示渲染后的內(nèi)容
加了v-cloak的代碼

2.數(shù)組更新問(wèn)題

代碼

<body>
    <style type="text/css">
        [v-cloak]{
            display: none;
        }
    </style>
    <div id="app" v-cloak>
        <div v-for="item in items">
            {{item}}
        </div>
    </div>
    <button onclick="update()">更新2為new2</button>
    <script type="text/javascript" src="vue.js"></script>
    <script type="text/javascript">
        var items = [1,2,3,4,5]
        var vm = new Vue({
            el: '#app',
            data:{
                items: items
            }
        })
        function update(){
            items[1] = 'new2'
        }
    </script>
</body>

我想更新items第2項(xiàng)的值為new2考赛,點(diǎn)擊按鈕的時(shí)候惕澎,發(fā)現(xiàn)數(shù)據(jù)并沒(méi)有更新,其它vue文檔里面有說(shuō)明颜骤,哪些操作數(shù)組是可以檢測(cè)到更新(文檔鏈接)和注意事項(xiàng)(文檔鏈接)唧喉,用索引直接改變數(shù)組的值vue是不能檢測(cè)到變動(dòng)的,但是有提供解決方法忍抽,用$set方法

items[1] = 'new2'
改成
vm.$set(vm.items, 1, 'new2')

3.對(duì)象檢測(cè)更新

<body>
    <style type="text/css">
        [v-cloak]{
            display: none;
        }
    </style>
    <div id="app" v-cloak>
        <div v-for="(item, index) in items">
            <div v-show="!item.isHide">
                title:{{item.title}} <br/>
                content:{{item.content}}<br/>
                <button @click="hide(item)">隱藏</button>
            </div>
            <hr>
        </div>
    </div>
    <script type="text/javascript" src="vue.js"></script>
    <script type="text/javascript">
        var items = [
            {
                title:'title1',
                content:'content1'
            },{
                title:'title2',
                content:'content2'
            }
        ]
        new Vue({
            el: '#app',
            data:{
                items:items
            },
            methods:{
                hide:function(item){
                    item.isHide = true
                }
            }
        })
    </script>
</body>

點(diǎn)擊隱藏的時(shí)候想隱藏當(dāng)前數(shù)據(jù)八孝,隱藏是用對(duì)象的isHide屬性控制的,點(diǎn)擊的時(shí)候鸠项,我們給當(dāng)前對(duì)象添加一個(gè)isHide屬性干跛,值為true,但是并沒(méi)有實(shí)現(xiàn)我們需要的效果祟绊。為什么呢楼入,因?yàn)閂ue 不能檢測(cè)對(duì)象屬性的添加或刪除,那怎么整牧抽?
解決方法有兩種:

  • 遍歷數(shù)據(jù)前嘉熊,給所有對(duì)象加上isHide這個(gè)屬性
  • $set函數(shù)

遍歷數(shù)據(jù)前,給所有對(duì)象加上isHide這個(gè)屬性

var items = [
            {
                title:'title1',
                content:'content1'
            },{
                title:'title2',
                content:'content2'
            }
        ]

        items.forEach(v=>{
            v.isHide = false
        })
        
        new Vue({
            el: '#app',
            data:{
                items:items
            },
            methods:{
                hide:function(item){
                    item.isHide = true
                }
            }
        })

$set函數(shù)

new Vue({
            el: '#app',
            data:{
                items:items
            },
            methods:{
                hide:function(item){
                    this.$set(item, 'isHide', true)
                }
            }
        })

留個(gè)問(wèn)題給大家阎姥,代碼如下记舆,1s后我用索引改變數(shù)組第2項(xiàng)的content屬性的值鸽捻,能否生效

<body>
    <style type="text/css">
        [v-cloak]{
            display: none;
        }
    </style>
    <div id="app" v-cloak>
        <div v-for="(item, index) in items">
            title:{{item.title}} <br/>
            content:{{item.content}}<br/>
            <hr>
        </div>
    </div>
    <script type="text/javascript" src="vue.js"></script>
    <script type="text/javascript">
        var items = [
            {
                title:'title1',
                content:'content1'
            },{
                title:'title2',
                content:'content2'
            }
        ]
        new Vue({
            el: '#app',
            data:{
                items:items
            }
        })
        setTimeout(function(){
            items[1].content = 'newcontent'
        },1000)
    </script>
</body>

4.render函數(shù)

我們的項(xiàng)目的數(shù)據(jù)基本都是題目數(shù)據(jù)呼巴,數(shù)據(jù)來(lái)源比較多,所以數(shù)據(jù)格式多種多樣御蒲,但題目的類型是相對(duì)固定的衣赶,基本是選擇題(單選題,多選題)厚满,判斷題府瞄,排序題,連線題等,所以我們針對(duì)這些題目做了相應(yīng)的組件遵馆,每種組件的需要的數(shù)據(jù)格式我們定義一種通用的格式鲸郊,把各種不同的數(shù)據(jù)格式轉(zhuǎn)成通用格式組件就可以復(fù)用了。那么問(wèn)題來(lái)了货邓,程序傳一組數(shù)據(jù)(試卷)進(jìn)來(lái)秆撮,我們?cè)趺锤鶕?jù)題類型的去調(diào)用相應(yīng)的組件渲染呢?用v-if换况?


題目基本類型

  • 選擇題
  • 排序題

題目數(shù)據(jù)中有個(gè)type字段來(lái)用標(biāo)識(shí)題目類型

  • 1 表示單選題
  • 2 表示多選題
  • 3 表示排序題

定義組件

選擇題

數(shù)據(jù)格式

       {
            title:'dan xuan ti',//標(biāo)題
            type:1,//題目類型
            options:['danxuan1','danxuan2','danxuan3','danxuan4'] //題目選項(xiàng)
        }

單選題和多選題目其實(shí)可以用一個(gè)組件职辨,只是標(biāo)題有和input的type有些不一樣

選擇題組件代碼
Vue.component('e-choice',{      
        template:`
            <div>
                <div>題目類型:{{typeName}}</div>
                <div>{{index}}. {{topic.title}}</div>
                <div v-for="(option,key) in topic.options">
                    <input :type="inputType" :name="index" />{{choiceOption(key)}}: {{option}}
                </div>
            </div>
        `,
        methods:{
            choiceOption:function(index){
                return String.fromCharCode(65+index)
            }
        },
        computed:{
            typeName:function(){
                return this.topic.type === 1? '單選題':'多選題'
            },
            inputType:function(){
                return this.topic.type === 1? 'radio':'checkbox'
            }
        },
        props:['index','topic']
    })

index 是題目在這張?jiān)嚲碇械捻樞颍?br> topic 是題目數(shù)據(jù)
單選題用radio,多選題用checkbox

單選題渲染效果
單選題渲染效果
多選題渲染效果
多選題渲染效果

排序題

數(shù)據(jù)格式

       {
            title:'pai xu ti',
            type:3,
            options:['pai xu 3','pai xu 2','pai xu 1','pai xu 4',]
        }
排序題組件代碼
Vue.component('e-sort',{
        template:`<div>
                        <div>題目類型:排序題</div>
                        <div>{{index}}. {{topic.title}}</div>
                        <blockquote>
                            <div v-for="(option,key) in topic.options">
                            {{key+1}}: {{option}}
                        </div>
                        </blockquote>
                    </div>`,
        props: ['index','topic']
    })

很簡(jiǎn)單戈二,只是遍歷下數(shù)據(jù)

渲染效果

現(xiàn)在給了一張?jiān)嚲頂?shù)據(jù)舒裤, 怎么根據(jù)題目類型調(diào)用相應(yīng)的組件把這些數(shù)據(jù)渲染出來(lái)呢

var data = [
        {
            title:'dan xuan ti',
            type:1,
            options:['danxuan1','danxuan2','danxuan3','danxuan4']
        },
        {
            title:'pai xu ti',
            type:3,
            options:['pai xu 3','pai xu 2','pai xu 1','pai xu 4',]
        },

        {
            title:'duo xuan ti',
            type:2,
            options:['duoxuan1','duoxuan2','duoxuan3','duoxuan4']
        },
        {
            title:'pai xu ti',
            type:3,
            options:['pai xu 3','pai xu 2','pai xu 1','pai xu 4',]
        },{
            title:'dan xuan ti',
            type:1,
            options:['danxuan1','danxuan2','danxuan3','danxuan4']
        },
        {
            title:'pai xu ti',
            type:3,
            options:['pai xu 3','pai xu 2','pai xu 1','pai xu 4',]
        },
        
        {
            title:'duo xuan ti',
            type:2,
            options:['duoxuan1','duoxuan2','duoxuan3','duoxuan4']
        },
        {
            title:'pai xu ti',
            type:3,
            options:['pai xu 3','pai xu 2','pai xu 1','pai xu 4',]
        }
    ]

這里我們就可以用render函數(shù)來(lái)解決我們的問(wèn)題

new Vue({
        el:'#app',
        data:{
            topics:data
        },
        render:function(createElement){
            return createElement('div', this.topics.map((v,index)=>{
                switch(v.type){
                    case 1://單選題
                    case 2://多選題
                        return createElement('e-choice',{
                                        props:{
                                            index:index + 1,
                                            topic:v
                                        }
                                    })
                        break
                    case 3://排序題
                        return createElement('e-sort',{
                                        props:{
                                            index:index + 1,
                                            topic:v
                                        }
                                    })
                        break
                    default:
                        console.error('type not implement')
                        break
                }
            }))
        }
    })
QQ20180420-125421@2x.png

最后打個(gè)廣告

招前端開(kāi)發(fā)绢彤,簡(jiǎn)歷投遞:liubin#readboy.com宴卖,#替換成@假消,簡(jiǎn)歷標(biāo)注:簡(jiǎn)書(shū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桨菜,一起剝皮案震驚了整個(gè)濱河市古程,隨后出現(xiàn)的幾起案子岳颇,更是在濱河造成了極大的恐慌烫止,老刑警劉巖奈泪,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒北,死亡現(xiàn)場(chǎng)離奇詭異黎侈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闷游,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門峻汉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脐往,你說(shuō)我怎么就攤上這事休吠。” “怎么了业簿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵瘤礁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我梅尤,道長(zhǎng)柜思,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任巷燥,我火速辦了婚禮赡盘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰揪。我一直安慰自己陨享,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著抛姑,像睡著了一般赞厕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上定硝,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天坑傅,我揣著相機(jī)與錄音,去河邊找鬼喷斋。 笑死唁毒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的星爪。 我是一名探鬼主播浆西,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顽腾!你這毒婦竟也來(lái)了近零?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抄肖,失蹤者是張志新(化名)和其女友劉穎久信,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體漓摩,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裙士,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了管毙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腿椎。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夭咬,靈堂內(nèi)的尸體忽然破棺而出啃炸,到底是詐尸還是另有隱情,我是刑警寧澤卓舵,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布南用,位于F島的核電站,受9級(jí)特大地震影響掏湾,放射性物質(zhì)發(fā)生泄漏裹虫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一忘巧、第九天 我趴在偏房一處隱蔽的房頂上張望恒界。 院中可真熱鬧睦刃,春花似錦砚嘴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耸采。三九已至,卻和暖如春工育,著一層夾襖步出監(jiān)牢的瞬間虾宇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工如绸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘱朽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓怔接,卻偏偏與公主長(zhǎng)得像搪泳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扼脐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345