不一样的Vue实战3:布局与组件
不一样的Vue实战3:布局与组件
http://yangyi1024.com/2017/06/05/%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84Vue%E5%AE%9E%E6%88%983-%E5%B8%83%E5%B1%80%E4%B8%8E%E7%BB%84%E4%BB%B6/
首先
首先:讲一句抱歉,周末俗事缠身,无力更博,只有今日发了。而且写博挺消耗精力的,你别看短短了几千字,需要反复的斟酌,反复的修改,如果有错误与不足的地方,请评论指正,谢谢!
前言
本文是结合官方的 api文档,进行渐进式学习,在实战中熟悉文档,在文档中理解实战。下面的代码中有详细的代码注释,和逻辑讲解,请仔细阅读。
3.1.1 什么是vue?
如果你还不知道什么Vue是干什么的,请参见什么是vue。
3.1.2 项目结构
参考以下的目录结构,新建文件夹,下面打‘ * ’的为新建文件夹
├── build // 构建服务和webpack配置
├── config // 项目不同环境的配置
├── dist // 项目build目录
├── index.html // 项目入口文件
├── package.json // 项目配置文件
├── src // 生产目录
│ ├── assets // 图片资源
│ ├── common * // 公共的css js 资源
│ ├── components // 各种组件
│ ├── moke * // 本地静态数据管理文件
│ ├── App.vue // 主页面
│ ├── vuex * // vuex状态管理器
│ ├── router // 路由配置器
│ └── main.js // Webpack 预编译入口
3.1.3 Vue 实例
新增知识点
步骤
打开 /src/main.js 你会看到
1
2
3
4
5
6
7
8
9
10
11
12
|
import Vue from 'vue' //引入vue模块
import App from './App' //引入vue组件
import router from './router' // 引入路由配置文件
Vue.config.productionTip = false // 关闭生产模式下给出的提示
new Vue({ // 创建一个 Vue 的根实例
el: '#app', //挂载id,这个实例下所有的内容都会在index.html 一个id为app的div下显示
router, // 注入路由配置。
template: '<App/>', //配置根模板 即打开页面显示那个组件
components: { App } // 注入组件
})
|
3.1.4 Style
第一步 安装less
在终端上输入
1
|
npm install --save-dev less-loader style-loader less
|
第二步 配置less
在 /build/webpack.base.conf.js 加上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
module.exports = {
module: {
rules: [
{ //把这个对象添加在里面
test: /\.less$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
'less-loader'
]
}
]
}
}
|
第三步 下载style文件
因为本课程主要是针对Vue的实战,所以在这里不去讲解less的用法,如果感兴趣可以去less教程学习,也不会讲每个样式怎么写,请下载Style文件,到 src/common/下。
3.1.5 ‘.vue’文件
Vue自定义了一种后缀名名字为
.vue
文件,它将html
,js
,css
整合成一个文件,和里面template
script
style
三个区别分别依次对应。12345678910<template><!--这里写 html --><template/><script>export default {};// 这里写js</script><style lang = "less" scoped><!--这里写css--></style>一个
.vue
文件就等于单独组件。因为.vue
文件是自定义的,浏览器不识别,所以要对该文件进行解析,在webpack构建中,需要安装vue-loader 对.vue文件进行解析。template
里面最外层必须是只有一个容器script
中的 export default {} 即导出这个组件,外部可以引用。style
中的lang
指额外表示支持的语言可以让编辑器识别,scoped
指这里写的css只适用于该组件。
3.1.6 新增layouts.vue(布局组件)
在学习了上一小节,我们知道了
.vue
文件是做什么用,下面我们就尝试一下。
在 src/components/目录下新建一个文件 layouts.vue,并且复制以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<template>
<section class="container" > <!--最外层容器-->
<section class="menu"> <!--左边的容器-->
</section>
<section class="content-container"><!--右边的容器-->
</section>
</section>
</template>
<script>
export default {};
</script>
<style lang="less">
@import '../common/style/layouts.less';
</style>
|
3.1.7 修改router(路由)
vue-router有什么用?
它的作用在于路由设置,用于设置页面跳转时的路径设置,它的工作原理也很简,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。
新增知识点(必看):
第一步:
打开 src/router/index.js 文件
复制以下代码,替换老的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import Vue from 'vue' // 导入Vue
import Router from 'vue-router' // 导入vue-router 库
import Layouts from '@/components/layouts' // 导入layouts.vue 组件
Vue.use(Router) //全局注册Router组件,它会绑定到Vue实例里面。
export default new Router({ // 创建 router 实例,然后传 `routes` 配置
routes: [
{
path: '/', //访问路径
name: 'Layouts', // 路径名
component: Layouts //访问的组件,即访问‘/’,它会加载 Layouts 组件所有的内容。
}
]
})
|
第二步:
浏览器打开 http://localhost:8080/ 你将看到如下的显示,那么这一步你就完成了。
3.1.8 menus.vue(菜单组件)
新增知识点(必读)
第一步:
在 src/components/目录下新建一个文件 menus.vue,并且复制以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<template>
<div class="list-todos"> <!--菜单容器-->
<a class="list-todo activeListClass list" > <!--单个菜单容器-->
<span class="icon-lock" ></span> <!--锁的图标-->
<span class="count-list">1</span><!--数字-->
星期一 <!--菜单内容-->
</a>
<a class=" link-list-new" > <!--新增菜单-->
<span class="icon-plus">
</span>
新增
</a>
</div>
</template>
<script>
export default {};
</script>
<style lang="less">
@import '../common/style/menu.less';
</style>
|
第二步:
我们在回到 Layouts.vue,并且新增以下打*
代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<template>
<section class="menu"> <!--左边的容器 里面加上组件 menus-->
<menus></menus> <!-- * -->
</section>
</template>
<script>
import menus from './menus'; // * 导入刚才我们创建的 menus组件
export default {
components: { // * 注册menus组件,让其可以在template调用
menus
}
};
</script>
|
最后我们的
menu
组件就注册成功啦,并且引用了它,你做的怎么样了呢?
3.1.9列表渲染
新增知识点(必读)
第一步:
回到 src/components/menus.vue,新增以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<template>
<a class="list-todo list activeListClass" v-for="item in items"> <!-- v-for 列表渲染-->
<span class="icon-lock" v-if="item.locked"></span> <!-- v-if 条件渲染-->
<span class="count-list" v-if="item.count >
0">{{item.count}}</span>
{{item.title}} <!-- 数据绑定,看模板语法-->
</a>
</template>
<script>
export default {
data() { //data函数
return {
items: [{ title: '星期一', count: 1, locked: true }, //菜单的模拟数据
{ title: '星期二', count: 2, locked: true }, {
title: '星期三', count: 3, locked: false
}]
};
}
};
</script>
|
完成后你将会看到以下内容。
现在整个页面我们已经左边的菜单部分,下面就是完成右边的详情部分。
3.1.10 todo.vue (待办事项详情组件)
新增知识点(必读)
第一步:
在 src/components/ 目录下新建一个文件 todo.vue,复制以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
<template>
<div class="page lists-show"><!--最外层容器-->
<nav><!--容器上半部分-->
<div class="nav-group"> <!--移动端的菜单图标-->
<a class="nav-item">
<span class="icon-list-unordered">
</span>
</a>
</div>
<h1 class="title-page">
<span class="title-wrapper">{{todo.title}}</span> <!-- 标题-->
<span class="count-list">{{todo.count}}</span><!-- 数目-->
</h1>
<div class="nav-group right"><!-- 右边的删除,锁定图标容器-->
<div class="options-web">
<a class=" nav-item"> <!-- 锁定图标-->
<span class="icon-lock" v-if="todo.locked"></span>
<span class="icon-unlock" v-else>
</span>
</a>
<a class=" nav-item"><!-- 删除图标-->
<span class="icon-trash">
</span>
</a>
</div>
</div>
<div class=" form todo-new input-symbol"> <!-- 新增单个代办单项输入框,监听了回车事件,双向绑定text值,监听了disabled属性,在todo.locked为true的情况下无法编辑-->
<input type="text" v-model="text" placeholder='请输入'@keyup.enter="onAdd" :disabled="todo.locked" />
<span class="icon-add"></span>
</div>
</nav>
<div class="content-scrollable list-items">
<!--容器下半部分-->
</div>
</div>
</template>
<script>
export default {
data() {
return {
todo: { //详情内容
title: '星期一',
count: 12,
locked: false
},
items: [ //代办单项列表
{ checked: false, text: '新的一天', isDelete: false },
{ checked: false, text: '新的一天', isDelete: false },
{ checked: false, text: '新的一天', isDelete: false }
],
text: '' //新增代办单项绑定的值
}
},
methods: {
onAdd() {
this.items.push({
checked: false, text: this.text, isDelete: false
}); // 当用户点击回车时候 ,给items的值新增一个对象,this.text 即输入框绑定的值
this.text = ''; //初始化输入框的值。
}
}
}
</script>
<style lang = "less">
@import '../common/style/nav.less';
@import '../common/style/form.less';
@import '../common/style/todo.less';
</style>
|
第二步
打开 src/components/layouts.vue文件
新加入以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<template>
<section class="content-container"><!--右边的容器-->
<todo></todo>
</section>
</template>
<script>
import todo from './todo';
export default {
components: {
todo //新加的
}
};
</script>
|
最后:
3.1.11 item.vue(代办单项组件)
新增知识点
-
第一步:
在 src/components/ 目录下新建一个文件 item.vue,复制以下代码。
123456789101112131415161718192021<template><div class="list-item editingClass editing"> <!-- 最外层容器--><label class="checkbox"> <!--自定义的多选框--><input type="checkbox" v-model="item.checked"> <!--item.checked--><span class="checkbox-custom"></span></label><input type="text" v-model="item.text" placeholder='写点什么。。。'> <!--绑定item.text--><a class="delete-item"> <!--删除图标--><span class="icon-trash"></span></a></div></template><script>export default {props: ['item'] //子组件显式的用 props 选项声明它期待获得的数据,这里申明 它想要一个叫做 ’item‘的数据。};</script><style lang="less">@import '../common/style/list-items.less';</style>第二步:
打开 src/components/todo.vue文件
新加入以下代码123456789101112131415<template><div class="content-scrollable list-items"><div v-for="item in items"> <!-- 这里`v-for`会循环我们在 `data`函数 事先定义好的 ’items‘模拟数据,循环后拿到单个对象,在通过prop把数据传输给子组件 item --><item :item="item"></item></div></div></template><script>import item from './item';export default {components: { //新加components对象item //新加的}};</script>
最后
在新增的输入框里面,输入点东西,并且回车,看看有没有达到效果。
小结
不一样的Vue实战3:布局与组件的更多相关文章
- Vue实战狗尾草博客管理系统第一章
Vue实战狗尾草博客后台管理系统第一章 这里准备采用的技术栈为:vue全家桶+element-ui 这里因为是后台管理系统,没有做SSR的必要.所以这里就采用前后端分离来昨晚这个项目~ 项目搭建 vu ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】
缘起 哈喽大家好,兜兜转转终于来到了Vue实战环节,前边的 6 篇关于Vue基础文章我刚刚简单看了看,感觉写的还是不行呀,不是很系统,所以大家可能看上去比较累,还是得抽时间去润润色,修改修改语句和样式 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
前言 哈喽大家周五好,马上又是一个周末了,下周就是中秋了,下下周就是国庆啦,这里先祝福大家一个比一个假日嗨皮啦~~转眼我们的专题已经写了第 23 篇了,好几次都坚持不下去想要中断,不过每当看到群里的交 ...
- vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...
- vue实战记录(六)- vue实现购物车功能之地址列表选配
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...
- vue实战记录(四)- vue实现购物车功能之过滤器的使用
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(四) GitHub:sue ...
- vue实战记录(三)- vue实现购物车功能之渲染商品列表
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
- vue实战记录(一)- vue实现购物车功能之前提准备
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...
随机推荐
- C++的new&delete
new的过程 new的过程:先分配memory,再调用ctor 我们常用的创建对象的方法有两种 Complex c(1,2); //栈 Complex *pc = new Complex(1,2); ...
- Fluent_Python_Part2数据结构,04-text-byte,文本和字节序列
文本和字节序列 人使用文本,计算机使用字节序列 1. 大纲: 字符.码位和字节表述 bytes.bytearray和memoryview等二进制序列的独特特性 全部Unicode和陈旧字符集的编解码器 ...
- 静态成员、final成员、面向对象接口
静态成员 静态属性定义时在访问控制关键字后面加static 在类定义中使用静态成员的时候,用self关键字后面跟着::操作符,在访问静态成员的时候::后面需要跟$符号 在类定义外部访问静态属性,用类名 ...
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
- 使用maven搭建web项目
在pom.xml中添加java ee相关的三个依赖包:<scope> jar的有效范围 provided 表示编译期生效,不会打包发布到 tomcat 中 <properties&g ...
- 数据包报文格式(IP包、TCP报头、UDP报头)
转自: https://blog.51cto.com/lyhbwwk/2162568 一.IP包格式 IP数据包是一种可变长分组,它由首部和数据负载两部分组成.首部长度一般为20-60字节(Byte) ...
- js判断对象中是否存在某一项和判断是否是对象
1.判断是否为对象 let str = { name: '第一', age: 12 } console.log(typeof str== "object") 2.判断对象中是否有某 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:标题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:移除默认的列表样式
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- 学习笔记(12)- chatopera的语义理解系统
参考https://github.com/chatopera/clause-py-demo 前提:安装完毕 Docker.Docker Compose 和 Python3.x git clone ht ...