Vue.js iview 項目中的踩過的坑和用法

最近幾個月一直在搞公司的網(wǎng)站走芋,最近一周把公司項目的做了移動端適配。露露臉叉寂。

2DE8C0A3-1080-4AA0-B1B7-33A082E70D37.png

54A1B744-3818-4E8F-8039-DFC08B53BC5E.png

4333D89F-A727-4341-8975-4D3BE4018E2F.png

覺得滿滿的成就感萍启。
廢話不多說了,開始正題屏鳍。

vue我說下我的理解勘纯,就是一個在一個html中進行組件化開發(fā)。有點mvvm的意思.
項目開始你要先找main.js文件钓瞭,引入要用的插件驳遵。

import Vue from 'vue';
import iView from 'iview';//iview
import VueRouter from 'vue-router';//路由
import Vuex from 'vuex';

然后當然要引用

Vue.use(VueRouter);
Vue.use(Vuex);

如果你想要封工具類,并且引用

import * as tools from './libs/tools'//引入所有的export
Vue.prototype.$tools = tools
用法  this.$tools.method()

配置路由

import Routers from './router'; //在我們項目中是把路由單獨封了一個js出來
const RouterConfig = {
    mode: 'history',
    routes: Routers
};
const router = new VueRouter(RouterConfig);
new Vue({
    el: '#app',
    router: router,//路由
    store: store, //vuex
    render: h => h(App)
});

看一下我們router.js中的一些用法

import Main from './views/Main/Main.vue';
const routers = [
    {
    path: '/',
    meta: {
        title: ''
    },
    component: (resolve) => require(['./views/index.vue'], resolve)
    },
    {
        path: '/gotopage',
        meta: {
            title: ''
        },
        component: (resolve) => require(['./components/GotoPage.vue'], resolve)
        },
    {//Main
        path: '/',
        name: 'Main',
        title: '',
        component: Main,
        children: [
            {/** 搜索結(jié)果 */
                // path: '/result/:address', 
                path: '/result', 
                name: 'result',
                meta: {
                    title: ''
                },
                component: (resolve) => require(['./views/Result/Result.vue'], resolve),
           }
        ]
}
]
export default routers;
這里面包含在了  一般路由的配置和子路由的配置山涡。

寫到這發(fā)現(xiàn)講的有點亂堤结,好久沒搞博客了,最近打算拾起來佳鳖,慢慢來吧霍殴。
既然說到路由了,我就說下路由的傳參和跳轉(zhuǎn)系吩。

this.$router.replace({path:path,query:{key:value}})  //這種是跳轉(zhuǎn)保存之前的鏈接
this.$router.replace({path:path,query:{key:value}})  //這種是直接調(diào)換當前的鏈接

路由傳參分為兩種
一種是query傳參一種是params傳參
兩者的區(qū)別呢

this.$router.replace({path:path,query:{key:value}})   query傳參
this.$router.replace({name:name,params:{key:value}})  params傳參

query要用path來引入,params要用name來引入妒蔚,接收參數(shù)都是類似的穿挨,分別是this.$route.query.key和this.$route.params.key。
特別注意的是這里是this.$route而不是路由跳轉(zhuǎn)的this.$router

那么在路由路徑展示上是下面這個樣子的肴盏。

query     locahost:8081/#/login?name=fly&code=2
params  locahost:8081/#/login
看出差別了嗎科盛?一個是隱式傳參一個是顯示傳參

說了這么多,居然還沒有說vue的生命周期菜皂,請原諒我先盜兩張圖吧

![3504099265-580628fd03258_articlex.png](https://upload-images.jianshu.io/upload_images/2440780-b5cbf44be8b5aeb7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
   export default {
       beforeCreate () {
                console.group('beforeCreate 創(chuàng)建前狀態(tài)===============》');
               console.log("%c%s", "color:red" , "el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //undefined 
               console.log("%c%s", "color:red","message: " + this.message)  
        },
        created () {
            console.group('created 創(chuàng)建完畢狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化 
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化
        },
        beforeMount () {
            console.group('beforeMount 掛載前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + (this.$el)); //已被初始化
            console.log(this.$el);
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化  
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化  
        },
        mounted () {
            console.group('mounted 掛載結(jié)束狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //已被初始化
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化 
        },
        beforeUpdate () {
            console.group('beforeUpdate 更新前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);   
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        updated () {
            console.group('updated 更新完成狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el); 
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        beforeDestroy () {
            console.group('beforeDestroy 銷毀前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        destroyed () {
            console.group('destroyed 銷毀完成狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);  
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message)
        }
    }

其實用過之后發(fā)現(xiàn)也就是這樣贞绵,跟ios的生命周期差不多。嘿嘿恍飘。
有個小坑得說下榨崩。

在created方法中是無法獲取dom元素的谴垫。比如document.getElementid('id').啥啥就無法獲取到。
如果要用的話需要到mounted方法中來用母蛛。
原因嘛在這里翩剪。
created:在模板渲染成html前調(diào)用,即通常初始化某些屬性值彩郊,然后再渲染成視圖前弯。
mounted:在模板渲染成html后調(diào)用,通常是初始化頁面完成后秫逝,再對html的dom節(jié)點進行一些需要的操作

好的恕出,下面開始講下一些常用的方法。

v-show   v-if 區(qū)別
v-show 會在app初始化的時候編譯并且渲染违帆,并且在之后一直存在剃根。當切換v-show模塊時,只是簡單的更改css前方。
v-if 當切換v-if模塊時狈醉,Vue.js 有一個局部編譯/卸載過程,因為 v-if 之中的模板也可能包括數(shù)據(jù)綁定或子組件惠险。v-if 是真實的條件渲染苗傅,因為它會確保條件塊在切換當中合適地銷毀與重建條件塊內(nèi)的事件監(jiān)聽器和子組件。 v-if 是惰性的班巩,如果為false渣慕,則什么也不編譯,不渲染抱慌。 當?shù)谝淮螚l件為真時逊桦,才開始編譯。
當你用的時候你其實可以看下v-if的模塊抑进,如果v-if='false'你發(fā)現(xiàn)找不到他强经,因為他根本就沒有創(chuàng)建.而v-show則可以看到,display:none;
:class
:class="{listpadRight:true,'ShowShaow':isShowShaow}
記住就行啦寺渗,第一個不要加引號匿情,后面的加引號就可以啦。
v-model
用來數(shù)據(jù)綁定的信殊,適用于 input
比如 <Input v-model="passWord" placeholder="輸入驗證碼"></Input>
data(){
   return{
      passWord:''
   } 
}

因為vue是組件式開發(fā)炬称,所以每一個vue可以當做一個組件,那么就會引出一塊的東西來涡拘,比如組件怎么用玲躯,父組件怎么調(diào)用子組件方法,子組件怎么調(diào)用父組件方法,傳值啦跷车,等等棘利。

先說下用法

 import tokenquote from './TokenQuote'   引入組件
   components:{
         tokenquote,   //引入到當前vue文件的組件中
    },
 <tokenquote ></tokenquote>   用法其實跟普通的html標簽一樣的。

繼續(xù)往下看哦姓赤,下面是組件之間的傳值方法互吊赡译。

首先是父組件調(diào)用子組件

 <tokentranscnt ref="sub"></tokentranscnt>  ref來標記子組件
 this.$refs.sub.subinit(this.token_address)    可以用從refs中取出sub來調(diào)用自己的組件內(nèi)的方法,subinit方法是tokentranscnt組件內(nèi)的方法,寫在method里面就可以不铆。簡單吧

敲黑板啦蝌焚,下面是子組件調(diào)用父組件的方法

我直接舉例子吧。
<subView v-on:getNodes="getNodes" v-on:ShowIntruduce="ShowIntruduce"></subView > 這是子組件在父組件中寫的形式誓斥,拿v-on綁定父組件中的方法只洒。比如getNodes   ShowIntruduce 方法,這些都要在父組件的method里面實現(xiàn)劳坑。

上面的getNodes方法記得如果傳值的話后面不要加()毕谴,加了的話會收不到值。
那么子組件怎么調(diào)用這些方法呢距芬?看下面
在子組件需要調(diào)用的地方涝开,直接觸發(fā)這個方法。
this.$emit('hideNode',data);  
hideNode是父組件v-on綁定的方法   data是傳過去的值框仔。
應(yīng)該挺清楚了吧舀武。。

iview是我們開發(fā)所用的開發(fā)框架离斩。
挑重點講:
iview如何修改框架所帶的默認屬性银舱?

很簡單啦!
<div id = 'body'>
   <col></col>
</div>
比如這樣
#body > .ivu-tabs .ivu-tabs-content{
   margin-top:12px;
}
我們可以在組件的最外層套上一層我們的標簽跛梗。然后從外面往里面一層一層找索要修改的屬性
記住哈寻馏!是在style中修改,而不是在style scope中修改核偿。再style中修改會全局覆蓋所以我們要在最外面套一層標簽诚欠,這樣就不會引起錯誤了。
image.png

這樣的效果怎么實現(xiàn)呢宪祥?注意是在iview的table中實現(xiàn)的哦D粜健!蝗羊!

直接上代碼,包含checkbox的選擇框仁锯,
 { 
                   ellipsis:true,
                      title:this.$t('Object'),
                      key:'',
                      align: 'center',
                      width:110,
                      render:(h,params)=>{
                                return  h('div',{
                                                          },[
                                  h('Checkbox',{
                                            props:{
                                                indeterminate:params.row.status == '3',
                                                value:params.row.status=='1',
                                                disabled:params.row.status == '4'
                                            },
                                            style:{
                                                width:'16px',
                                                height:'16px',
                                                float:'left',
                                                'margin-left':'0px'
                                            },
                                            on: {
                                                click:()=>{
                                                event.stopPropagation()
                                                },
                                                'on-change': (data) => {
                                                  this.isstopPropagation = true;
                                                if(data == true){
                                                    this.data= this.changeStatus(this.data,'1',params.index);
                                                }else{
                                                    this.data = this.changeStatus(this.data,'2',params.index);
                                                }

                                                this.spinShow = true;
                                                this.$emit('clickTransObject',data,params.row.to);
                                                }
                                            },
                                        }),
                             h('poptip',{
                                    props:{
                                        trigger:'hover',
                                        placement:'bottom-start',
                                        width:'308',
                                        height:'88',
                                        confirm:false,
                                        
                                    },
                                    style:{
                                        'margin-left':'0px',
                                        
                                    }
                               }, [
                                    h('div',[
                                      
                                        h('p',{
                                            style:{
                                                width:'100px',
                                                'font-size':'12px',
                                                color:'#333333',
                                                display:'initial'
                                            }
                                        },this.getObject(params.row.alias_name,params.row.to))
                                    ]),          
                                     h('div',{
                                                slot:'content',
                                            },[
                                                h('p',{
                                                    style:{
                                                        width:'60px',
                                                        'font-size':'12px',
                                                        color:'#000000',
                                                        display:'inline'
                                                    }
                                                },"address:"),
                                                h('Button',{                                         
                                                    props:{
                                                        // type:'Ghost',
                                                    },
                                                    attrs:{
                                                        // class:'js-copy',
                                                        // 'data-clipboard-text':params.row.to,
                                                    },
                                                    style:{
                                                        width:'52px',
                                                        height:'20px',
                                                        border: '1px solid #343A45',
                                                        'font-size':'12px',
                                                        'padding':'0px',
                                                        'margin-left':'5px',
                                                        display:'inline',
                                                        'background-color':'#ffffff'
                                                    },
                                                    on:{
                                                        click:()=>{
                                                          this.$tools.copyText(params.row.to)
                                                    event.stopPropagation()
                                                    this.$Message.config({
                                                            content: this.$t('CopyS'),
                                                            duration: 5,
                                                            top:300,
                                                        });
                                                    this.$Message.success({
                                                        content:this.$t('CopyS')
                                                    });
                                                        }
                                                    }
                                                },this.$t('Copy')),
                                                h('p',{
                                                    style:{
                                                        width:'290px',
                                                        'padding-top':'5px',
                                                        'font-size':'12px',
                                                        color:'#000000',
                                                    }
                                                },params.row.to)

                                            ])
                            ])
                    ])
                 }
                },

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耀找,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌野芒,老刑警劉巖蓄愁,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狞悲,居然都是意外死亡撮抓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門摇锋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丹拯,“玉大人,你說我怎么就攤上這事荸恕」猿辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵融求,是天一觀的道長咬像。 經(jīng)常有香客問我,道長生宛,這世上最難降的妖魔是什么县昂? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮陷舅,結(jié)果婚禮上倒彰,老公的妹妹穿的比我還像新娘。我一直安慰自己蔑赘,他們只是感情好狸驳,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缩赛,像睡著了一般耙箍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酥馍,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天辩昆,我揣著相機與錄音,去河邊找鬼旨袒。 笑死汁针,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的砚尽。 我是一名探鬼主播施无,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼必孤!你這毒婦竟也來了猾骡?” 一聲冷哼從身側(cè)響起瑞躺,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兴想,沒想到半個月后幢哨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡嫂便,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年捞镰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毙替。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岸售,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔚龙,到底是詐尸還是另有隱情冰评,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布木羹,位于F島的核電站甲雅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坑填。R本人自食惡果不足惜抛人,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脐瑰。 院中可真熱鬧妖枚,春花似錦、人聲如沸苍在。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂恬。三九已至续誉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初肉,已是汗流浹背酷鸦。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牙咏,地道東北人臼隔。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像妄壶,于是被迫代替她去往敵國和親摔握。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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