堂外堂项目复习

文件的目录结构

目录结构

main.js中创建一个vue实例,引用了APP组件

new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

APP组件中,使用router-view去配置路由
主要是构建 SPA (单页应用) 时,方便渲染你指定路由对应的组件。你可以 router-view 当做是一个容器,它渲染的组件是你使用 vue-router 指定的。
参考

export default和export的区别

首先export default和export都可以导出常量、函数、文件、模块等,跟import配合使用。
在一个文件和模块中,export、import可以有多个,但是export default只能有一个,最后通过export方式导出,导入的时候需要添加{},export default不需要。

项目中的使用

import vHeader from "./Header"
import vSidebar from "./Sidebar"
export default{
    components:{
        vHeader,vSidebar
    }
}

还有一点需要注意使用export default命令,为模块指定默认输出,这样就不需要知道所要加载的模块名称,看下面例子

//a.js
let sex = "boy";
export default sex(sex不能加大括号)
//原本直接export sex外部是无法识别的,加上default就可以了.但是一个文件内最多只能有一个export default。
//其实此处相当于为sex变量值"boy"起了一个系统默认的变量名default,自然default只能有一个值,所以一个文件内不能有多个export default。
// b.js
本质上,a.js文件的export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含
import any from "./a.js"
import any12 from "./a.js" 
console.log(any,any12)   // boy,boy

参考链接

style中的scoped属性

当style标签中含有scoped属性的时候,说明这个CSS只能作用于当前的组件
使用如下:

<style scoped>
    .header {
        position: relative;
        box-sizing: border-box;
        width: 100%;
        height: 70px;
        font-size: 22px;
        line-height: 70px;
        color: #fff;
    }
</style>

扩展知识:
1.在同一个组件中,可以包含有作用域和无作用域

<style>
/* global styles */
</style>

<style scoped>
/* local styles */
</style>

2.子组件引用了父组件后,父组件的有作用域会影响子组件
参考文章

项目中的数据处理

项目中的数据主要是通过放在export default{}里面,然后使用data(){}

使用如下:

export default {
    data() {
        return {
            tableRole: [{
                name: '广告1'
            }, {
                name: '广告2'
            }, {
                name: '广告3'
            }]
        }
    }
}

然后之前的项目的话是使用原生的ajax,在这里说一下原生ajax的请求过程,还有它的优缺点
参考文章

登录状态的记住(重点难点)

使用了localStorage
核心代码:
html代码

<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm">
    <el-form-item prop="username">
        <!-- 自定义事件可以用来创建自定义的表单输入组件,使用 v-model 来进行数据双向绑定 -->
        <el-input v-model="ruleForm.username" placeholder="username"></el-input>
    </el-form-item>
    <el-form-item prop="password">
        <el-input type="password" placeholder="password" v-model="ruleForm.password" @keyup.enter.native="submitForm('ruleForm')"></el-input>
    </el-form-item>
    <div class="login-btn">
        <el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
    </div>
    <p style="font-size:12px;line-height:30px;color:#999;">Tips : 用户名和密码随便填。</p>
</el-form>

注意这里的这一行代码

@keyup.enter.native="submitForm('ruleForm')"

首先@代表的是v-on,还有这里监听键盘事件的时候,我们常常需要监听常见的键值,虽然我们可以通过keyCode的方式去监听,但是为了方便起见,Vue为最常用的键提供了别名,enter就是其中的一个。

参考

另外,使用.native修饰v-on,给组件绑定一个原生的组件

<my-component v-on:click.native="doTheThing"></my-component>

JavaScript代码

methods: {
    submitForm(formName) {
        const self = this;
        self.$refs[formName].validate((valid) => {
            if (valid) {
                //localStorage.setItem(key,value):将value存储到key字段
                localStorage.setItem('ms_username',self.ruleForm.username);
                self.$router.push('/readme');
            } else {
                console.log('error submit!!');
                return false;
            }
        });
    }
}

这里需要注意:

  • 子组件索引:
    ref指定id,然后通过$refs访问子组件,例子如下:
<div id="parent">
  <user-profile ref="profile"></user-profile>
</div>
var parent = new Vue({ el: '#parent' })
// 访问子组件
var child = parent.$refs.profile

注意:$refs只在组件渲染完成后才填充,并且它是非响应式的.
它仅仅是访问子组件的一个应急方案——应当避免在模板或计算属性中使用 $refs。

参考

  • localStorage的使用
localStorage.setItem('ms_username',self.ruleForm.username);

Vue的生命周期

选项 / 生命周期钩子

首先注意一点的是:
所有的生命周期钩子都自动绑定了this上下文到实例中,因此你可以访问数据,对属性和方法进行运算。
但是 不可以使用箭头函数来定义一个生命周期方法。因为箭头函数绑定了父上下文,this和你期待的vue实例不同

  • beforeCreate。在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
  • create。在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
  • beforeMount。在挂载开始之前被调用:相关的 render 函数首次被调用。
  • mounted。el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。
  • beforeUpdate。数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
    你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
  • updated。由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
  • actived。keep-alive 组件激活时调用。
  • deactived。keep-alive 组件停用时调用。
  • beforeDestroy
  • destoryed

关于路由的配置(重点)

项目中的代码(核心)

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  mode: 'history',//HTML5 History 模式
  routes: [
    {
        path:'/',
        redirect:'/login'
    },
    {
        path:'/login',
        component:resolve => require(['../components/page/Login.vue'],resolve)
    },
    {
        path:'/readme',
        component:resolve =>require(['../components/common/Home.vue'],resolve),
        children:[
            {
                path:'/readme',
                component:resolve => require(['../components/page/Readme.vue'], resolve)
            },
            {
                path:'/user',
                component:resolve => require(['../components/page/User.vue'],resolve),

            },
            {
                path:'/userreview',
                component:resolve => require(['../components/page/UserReview.vue'],resolve)
            }
        ]
    }
  ]
})

主要是通过path设置路径,然后component设置使用的组件,当然也使用了路由嵌套。children中放置了一个数组,数组中的每一项都是一个对象,属性包含path和component。

具体的参考

导入静态文件

import '../static/css/main.css'

单页面应用的优点和缺点

参考

优点:
1、分离前后端关注点,前端负责界面显示,后端负责数据存储和计算,各司其职,不会把前后端的逻辑混杂在一起;
2、减轻服务器压力,服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍;
3、同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端;
缺点:
1、SEO问题,现在可以通过Prerender等技术解决一部分;
2、前进、后退、地址栏等,需要程序进行管理;
3、书签,需要程序来提供支持;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,040评论 0 29
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,183评论 0 6
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 10,971评论 4 129
  • Vue笔记系列1、Vue.js入门3、Vue.js进阶 API 以下会随用随记一些API,可能会不定期更新。 Vu...
    其心阅读 2,048评论 0 10