偽全棧假前端之路 - Vue.js篇

一僻澎、偽全棧假前端的定義

在做好數(shù)據(jù)庫(kù)設(shè)計(jì)貌踏,后臺(tái)開發(fā),前端接口之余窟勃,不用學(xué)node祖乳,npm,webpack等秉氧,只要會(huì)一點(diǎn)點(diǎn)Html+Css+Js就開始做前端開發(fā)眷昆。

二、Vue.js基礎(chǔ)

1.引入Vue.js

///如安裝Vue.js的Chrome插件進(jìn)行調(diào)試谬运,則需引入vue.dev.js版
<script src="vue.min.js"></script>

2.Html部分

<style type="text/css">
  .text-red{ color:red;}
</style>
<div id="app">
    <h5 class="class1" v-bind:class="{ 'text-red': class2 }">
        <i v-html="message1"></i>{{message}} 
    </h5>
    <hr />
    <div>
        <h5>input值為data數(shù)組長(zhǎng)度</h5>
        <input type="text" v-model="rows.length" />
        <button v-on:click="myclick();">列表加一行,同時(shí)改變標(biāo)題樣式</button>
    </div>
    <ul>
        <li v-for="(row,  index) in rows">{{index}}:{{ row.name }} </li>
    </ul>
</div>

3.Js部分

<script>
    new Vue({
        el: '#app',
        data: {
            message: '標(biāo)簽輸出綁定',
            message1: '<b>v-html</b>標(biāo)簽綁定隙赁,還有<b>v-text</b>文本綁定',
            class2: true,
            rows: [
                { name: '行1111' },
                { name: '行222' },
            ]
        },
        created: function () {
            this.rows.push({ name: "初始化加了一行" });
        },
        methods: {
            myclick: function () {
                this.rows.push({ name: "按鈕加一行" });
                this.class2 = !this.class2;
            }
        }
    });
</script>
三、Vue.js進(jìn)階(單頁面應(yīng)用)

1.準(zhǔn)備引入的js

 <script type="text/javascript" src="vue-dev.js"></script>
///ajax插件梆暖,類似的還有fetch.js
 <script type="text/javascript" src="axios.min.js"></script>
///頁面路由伞访,基本原理就是監(jiān)控hash并做了生命周期
 <script type="text/javascript" src="vue-router.min.js"></script>
///Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。
///簡(jiǎn)單講就是全局變量的存儲(chǔ)轰驳,但是刷新就會(huì)沒有厚掷,還需要localStorage做配合
 <script type="text/javascript" src="vuex.min.js"></script>
///第三方Vue的組件庫(kù)
 <script type="text/javascript" src="vonic.min.js"></script>
///網(wǎng)上單獨(dú)的插件,還有上傳等等级解,按需擴(kuò)展
<script type="text/javascript" src="vue-awesome-picker.js"></script>

2.核心js

<script>
    ///配置路由,無限極子路由
    var routes = [
        {
            path: '/',
            name: "Index",
            component: Index,//一個(gè)路由地址對(duì)應(yīng)一個(gè)組件
            children: [
                { path: 'home', component: Home },
                { path: 'discount', component: Discount, meta: { requireAuth: true } },
                {
                    path: 'sign', component: Sign,
                    children: [
                        { path: 'index', component: SignIndex },
                        { path: 'action/:id', component: SignAction }
                    ]
                },
                { path: 'pic', component: Pic },
                { path: 'user', component: User }
            ]
        }
        , { path: '/signRecord', component: SignRecord }
        , { path: '/Login', component: Login }
        , { path: '/wxBind', component: WXBind }
        , { path: '/nvr/:id', component: NVR }
    ];
    ///定義Vuex的倉(cāng)儲(chǔ)變量冒黑,全局拿store使用
    var store = new Vuex.Store({
        state: {
            uid: 0,
            isLoading: false
        },
        mutations: {//全局變量操作方法
            updateLoadingStatus(state, payload) {
                state.isLoading = payload.isLoading;
                if (state.isLoading) {
                    $loading.show("正在加載");//$loading是vonic插件的方法
                } else {
                    $loading.hide();
                }
            },
            set_token(state, token) {
                state.uid = token.uid;
            },
            del_token(state) {
                state.uid = 0;
                localStorage.removeItem('token');
            }
        }
    });
    var router = new VueRouter({ mode: "history", routes });//開啟歷史模式
    router.afterEach(function (to) {
        //切換路由顯示loading
        store.commit('updateLoadingStatus', { isLoading: false });
    })
    ///ajax請(qǐng)求添加頭內(nèi)容,判斷登錄是否超時(shí)
    axios.defaults.headers.common['Authentication-Token'] = store.state.token;
    // 添加請(qǐng)求攔截器
    axios.interceptors.request.use(config => {
        // 在發(fā)送請(qǐng)求之前做些什么
        //判斷是否存在token勤哗,如果存在將每個(gè)頁面header都添加token
        if (store.state.uid) {
            config.headers.common['Authentication-Token'] = store.state.uid
        }
        return config;
    },
    error => {
        // 對(duì)請(qǐng)求錯(cuò)誤做些什么
        return Promise.reject(error);
    });

    // http response 攔截器
    axios.interceptors.response.use(
        response => {
            return response;
        },
        error => {
            if (error.response) {
                switch (error.response.status) {
                    case 401:
                        this.$store.commit('del_token');
                        router.replace({
                            path: '/login',
                             //登錄成功后跳入瀏覽的當(dāng)前頁面
                            query: { redirect: router.currentRoute.fullPath }
                        })
                }
            }
            return Promise.reject(error.response.data)
        });
    //核心js抡爹,開始渲染頁面
    Vue.use(Vonic.app, { routes: routes, store: store });
</script>

3.組件寫法及Config配置

<script type="x-template" id="index">
        <div class="page">
            <router-view></router-view>
        </div>
</script>
<script>
var Index = {
    template: '#index',
    data() { return { data: data} },
    created: function () {
        config.init(); 
    },
    methods: {
          //自己寫方法
    },
    destroyed: function () {
         //vue的生命周期
    }
};
</script>
<script>
var config = {
        debug: true,
        storageKey: "token",
        apiURL: {
            mobileCode: '/loginApi/getcode',
        },
        init: function () {
            config.baseCheck();
        }
    };
</script>
四、自己寫Uploader

其實(shí)也沒寫組件···土上傳芒划,直接看代碼

///上傳壓縮插件
<script type="text/javascript" src="localResizeIMG/lrz.all.bundle.js"></script>
<div id="app">
  ///capture="camera"
  <input ref="uploader" type="file" accept="image/*" style="display:none;" v-on:change="onChange">
  <button @click="addPic">上傳按鈕樣式自己寫</button>
</div>
<script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            previewShow: false,
            previewImg: '',
        },
        methods: {
            addPic() {
                this.$refs.uploader.click();
            },
            onChange: function (e) {
                var files = e.target.files || e.dataTransfer.files;
                if (!files.length) return;
                _this.createImage(files);
            },
            createImage: function (file) {
                var _this = this;
                lrz(file[0], { width: 800 }).then(function (rst) {
                    _this.uploadImage(rst.base64);
                    return rst;
                }).always(function () {
                    e.target.value = null;// 清空文件上傳控件的值
                });
            },
            uploadImage: function (strBase64) {
                var _this = this;
                $loading.show("正在上傳...");
                var opts = {
                    url: config.apiURL.uploadImg,
                    data: { base64str: strBase64, uid: store.state.uid },
                    success: function (res) {
                        $loading.hide();
                        if (res.code > 0) {
                            _this.previewImg = res.msg;
                        }
                    }
                }
                vm_utils.req(opts);
            },
        }
    })
</script>
五冬竟、前端UI框架推薦

1.AmazeUI欧穴。簡(jiǎn)單易用的國(guó)產(chǎn)UI框架,可以寫前后端泵殴,js框架功能也馬馬虎虎涮帘。
2.Weui。主要做微信端應(yīng)用笑诅,Js部分基本沒用调缨,主要是拿來做樣式。
3.Layui吆你。后臺(tái)框架為主弦叶。后臺(tái)單頁面應(yīng)用。
4.其他····
在做項(xiàng)目時(shí)經(jīng)常會(huì)改動(dòng)默認(rèn)的樣式早处,假前端只要會(huì)寫優(yōu)先級(jí)最高的樣式重寫: !important 即可湾蔓。 如下所示:

<style>
     .font12{ font-size:12px !important;}
     .padding{ padding:5px 10px !important;}
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砌梆,隨后出現(xiàn)的幾起案子默责,更是在濱河造成了極大的恐慌,老刑警劉巖咸包,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃序,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烂瘫,警方通過查閱死者的電腦和手機(jī)媒熊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坟比,“玉大人芦鳍,你說我怎么就攤上這事「鹫耍” “怎么了柠衅?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)籍琳。 經(jīng)常有香客問我菲宴,道長(zhǎng),這世上最難降的妖魔是什么趋急? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任喝峦,我火速辦了婚禮,結(jié)果婚禮上呜达,老公的妹妹穿的比我還像新娘谣蠢。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布漩怎。 她就那樣靜靜地躺著勋颖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勋锤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天侥祭,我揣著相機(jī)與錄音叁执,去河邊找鬼。 笑死矮冬,一個(gè)胖子當(dāng)著我的面吹牛谈宛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胎署,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吆录,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了琼牧?” 一聲冷哼從身側(cè)響起恢筝,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巨坊,沒想到半個(gè)月后撬槽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾撵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年侄柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片占调。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暂题,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出究珊,到底是詐尸還是另有隱情薪者,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布苦银,位于F島的核電站啸胧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏幔虏。R本人自食惡果不足惜纺念,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望想括。 院中可真熱鬧陷谱,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宪躯,卻和暖如春乔宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背访雪。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工详瑞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臣缀。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓坝橡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親精置。 傳聞我的和親對(duì)象是個(gè)殘疾皇子计寇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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