├── docs ├── advanced │ ├── filters.md │ ├── components.md │ ├── axios.md │ └── components │ │ ├── props.md │ │ ├── components-basics.md │ │ └── emit.md ├── .vuepress │ ├── public │ │ ├── life-1.png │ │ ├── life-2.png │ │ ├── life-3.png │ │ ├── life-4.png │ │ ├── life-5.png │ │ ├── life-6.png │ │ ├── life-7.png │ │ ├── life-8.png │ │ ├── life-9.png │ │ ├── life-10.png │ │ ├── life-11.png │ │ └── computed-1.png │ ├── components │ │ ├── v-if │ │ │ ├── example1.vue │ │ │ ├── example1-2.vue │ │ │ ├── example1-3.vue │ │ │ └── example2.vue │ │ ├── v-model │ │ │ ├── example3.vue │ │ │ ├── example1.vue │ │ │ ├── example2.vue │ │ │ └── example4.vue │ │ ├── component │ │ │ ├── example2.vue │ │ │ ├── example2-2.vue │ │ │ ├── example2-3.vue │ │ │ ├── example1.vue │ │ │ ├── Button.vue │ │ │ ├── Button2-2.vue │ │ │ ├── Button2.vue │ │ │ └── Button2-3.vue │ │ ├── class │ │ │ ├── example1-2.vue │ │ │ └── example1-1.vue │ │ └── computeds │ │ │ ├── example1-1.vue │ │ │ ├── example1-2.vue │ │ │ ├── example2-1.vue │ │ │ └── example1-3.vue │ └── config.js ├── basics │ ├── instruct.md │ ├── instructs │ │ ├── others.md │ │ ├── v-on.md │ │ ├── v-bind.md │ │ ├── v-model.md │ │ ├── conditional.md │ │ └── list.md │ ├── watch.md │ ├── class-and-style.md │ ├── lifecycle.md │ └── computed.md ├── README.md └── introduction │ ├── introduce.md │ └── installation.md ├── .gitignore ├── deploy.sh ├── package.json └── README.md /docs/advanced/filters.md: -------------------------------------------------------------------------------- 1 | # 过滤器 filters 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | docs/.vuepress/theme/ 3 | docs/.vuepress/dist/ -------------------------------------------------------------------------------- /docs/.vuepress/public/life-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-1.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-2.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-3.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-4.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-5.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-6.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-7.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-8.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-9.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-10.png -------------------------------------------------------------------------------- /docs/.vuepress/public/life-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/life-11.png -------------------------------------------------------------------------------- /docs/.vuepress/public/computed-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyutim/start-from-scratch-learn-Vue/HEAD/docs/.vuepress/public/computed-1.png -------------------------------------------------------------------------------- /docs/advanced/components.md: -------------------------------------------------------------------------------- 1 | # 组件 components 2 | 3 | - [组件基础](components/components-basics.md) 4 | - [父向子传值 props](components/props.md) 5 | - [子向父传值 emit](components/emit.md) 6 | -------------------------------------------------------------------------------- /docs/basics/instruct.md: -------------------------------------------------------------------------------- 1 | # 指令 2 | 3 | 指令,是 Vue 中用来执行一系列操作的行内代码,以`v-`开头。因部分指令相对来说比较常用,写起来篇幅较大,所以把指令拆分成以下几个小节进行讲解。 4 | 5 | - [v-if/v-show](instructs/conditional.md) 6 | - [v-for](instructs/list.md) 7 | - [v-on](instructs/v-on.md) 8 | - [v-bind](instructs/v-bind.md) 9 | - [v-model](instructs/v-model.md) 10 | - [其他指令](instructs/others.md) 11 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-if/example1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-if/example1-2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-model/example3.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-model/example1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-model/example2.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/example2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/example2-2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/example2-3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 确保脚本抛出遇到的错误 4 | set -e 5 | 6 | # 生成静态文件 7 | npm run docs:build 8 | 9 | # 进入生成的文件夹 10 | cd docs/.vuepress/dist 11 | 12 | # 如果是发布到自定义域名 13 | # echo 'www.example.com' > CNAME 14 | 15 | git init 16 | git add -A 17 | git commit -m 'deploy' 18 | 19 | # 如果发布到 https://.github.io 20 | # git push -f git@github.com:/.github.io.git master 21 | 22 | # 如果发布到 https://.github.io/ 23 | git push -f git@github.com:shiyutim/start-from-scratch-learn-Vue.git master:gh-pages 24 | 25 | cd - -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "start-from-scratch-learn-Vue", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "https://github.com/shiyutim/start-from-scratch-learn-Vue.git", 6 | "author": "shiyutim ", 7 | "license": "MIT", 8 | "scripts": { 9 | "docs:dev": "vuepress dev docs", 10 | "docs:build": "vuepress build docs", 11 | "deploy": "bash deploy.sh" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.19.1" 15 | }, 16 | "devDependencies": { 17 | "vuepress": "^1.2.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-if/example1-3.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | 28 | -------------------------------------------------------------------------------- /docs/.vuepress/components/v-if/example2.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | 30 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/example1.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 49 | 50 | 54 | -------------------------------------------------------------------------------- /docs/.vuepress/components/class/example1-2.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | 29 | -------------------------------------------------------------------------------- /docs/.vuepress/components/class/example1-1.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 从零开始学习 Vue 2 | 3 | 从零开始学习 Vue,循序渐进的学习 Vue 中常用功能。 4 | 5 | ## 如果你觉得这个文档对你有帮助请点个 star,有任何意见可以提 issues。 6 | ## 如果有人看的话,我还会继续更新 Vue3 的文档的。 7 | 8 | 9 | ## 写作原因 10 | 11 | 写这个文档的起因是因为一个刚入行的朋友,要开始学习 Vue,给他解惑的重任自然就落在我身上了。但是让他自己看官方文档和通过我的一些只言片语是无法讲清楚的,想当初我学习的时候看官方文档也没有学的那么轻松,可能官网文档有些词语比较“晦涩”。但我经过长时间的使用后,再回过头来看官方文档,发现官方文档已经把所有的内容都写全了,只不过**有些地方**话语不够通俗易懂,**真实例子**不够详细。 12 | 13 | 所以,我准备在官方文档的基础上,把项目中常用的功能进行系统描述,同时每个“功能”之间尽可能的分离(内容不会涉及大量没有学习过的知识),用通俗易懂的话语和简单的代码展示出来,希望能够帮助**刚接触 vue**的同学尽快上手。同时,本文也不会把 Vue 的所有 API 一一进行讲解,只会挑选我们工作中使用频率最高的。 14 | 15 | 本篇文档是基于**Vue2.X 版本**进行讲解。所有内容都是在[官网文档](https://cn.vuejs.org/v2/guide/)的基础上进行扩充筛选。所以,初学者要对比着官网文档进行学习,如果两者有差异,**一切以官方文档为主** :thumbsup:。 16 | 17 | 因为本人并不是资深开发者,所以可能有些错误和漏洞,恳请各位多多指正。 18 | 19 | ## 适合人群 20 | 21 | 本文只适合初学者。如果你已经在工作中使用过一段时间的开发者,那么 Vue [官方文档](https://cn.vuejs.org/)才是你首要的目标。 22 | 23 | ## 阅读建议 24 | 25 | 本文通过循序渐进的方式,把 Vue 中的每个“功能模块”拆分开来进行讲解,上下文和例子的依赖比较明显。所以建议从**本文的开头依次进行学习**。同时,在每篇文章最后都有几个简单的小例子,建议看完后手动实现一下加深印象。 26 | 27 | 学习是一个从陌生到熟练的过程,如果你感觉学会了之后,一定要**多写**。 28 | 29 | ## 目录结构 30 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # 从零开始学习 Vue 2 | 3 | 从零开始学习 Vue,循序渐进的学习 Vue 中常用功能。 4 | 5 | [[toc]] 6 | 7 | ## 写作原因 8 | 9 | 写这个文档的起因是因为一个刚入行的朋友,要开始学习 Vue,给他解惑的重任自然就落在我身上了。但是让他自己看官方文档和通过我的一些只言片语是无法讲清楚的,想当初我学习的时候看官方文档也没有学的那么轻松,可能官网文档有些词语比较“晦涩”。但我经过长时间的使用后,再回过头来看官方文档,发现官方文档已经把所有的内容都写全了,只不过**有些地方**话语不够通俗易懂,**真实例子**不够详细。 10 | 11 | 所以,我准备在官方文档的基础上,把项目中常用的功能进行系统描述,同时每个“功能”之间尽可能的分离(内容不会涉及大量没有学习过的知识),用通俗易懂的话语和简单的代码展示出来,希望能够帮助**刚接触 vue**的同学尽快上手。同时,本文也不会把 Vue 的所有 API 一一进行讲解,只会挑选我们工作中使用频率最高的。 12 | 13 | 本篇文档是基于**Vue2.X 版本**进行讲解。所有内容都是在[官网文档](https://cn.vuejs.org/v2/guide/)的基础上进行扩充筛选。所以,初学者要对比着官网文档进行学习,如果两者有差异,**一切以官方文档为主** :thumbsup:。 14 | 15 | 因为本人并不是资深开发者,所以可能有些错误和漏洞,恳请各位多多指正。 16 | 17 | ## 适合人群 18 | 19 | 本文只适合初学者。如果你已经在工作中使用过一段时间的开发者,那么 Vue [官方文档](https://cn.vuejs.org/)才是你首要的目标。 20 | 21 | ## 阅读建议 22 | 23 | 本文通过循序渐进的方式,把 Vue 中的每个“功能模块”拆分开来进行讲解,上下文和例子的依赖比较明显。所以建议从**本文的开头依次进行学习**。同时,在每篇文章最后都有几个简单的小例子,建议看完后手动实现一下加深印象。 24 | 25 | 学习是一个从陌生到熟练的过程,如果你感觉学会了之后,一定要**多写**。 26 | 27 | ## 目录结构 28 | 29 | ## 开始学习 30 | 31 | 如果你准备好了学习,那么就请[点击这里吧](introduction/installation.md)。 32 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/Button.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 50 | 51 | 72 | -------------------------------------------------------------------------------- /docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | { 2 | /*
3 | 4 |
*/ 5 | } 6 | 7 | module.exports = { 8 | title: 'start-from-scratch-learn-Vue', 9 | description: 'Just playing around', 10 | displayAllHeaders: true, // true为显示所有页面的标题链接 11 | collapsable: false, // false 为导航栏展开 12 | base: '/start-from-scratch-learn-Vue/', 13 | themeConfig: { 14 | sidebar: [{ 15 | title: '前言', // 必要的 16 | // path: '/', // 可选的, 应该是一个绝对路径 17 | collapsable: false, // 可选的, 默认值是 true, 18 | sidebarDepth: 2, // 可选的, 默认值是 1 19 | children: ['/'] 20 | }, 21 | { 22 | title: '简介', 23 | collapsable: false, 24 | sidebarDepth: 1, 25 | children: ['introduction/installation.md', 'introduction/introduce.md'] 26 | }, 27 | { 28 | title: '入门篇', 29 | collapsable: false, 30 | sidebarDepth: 2, 31 | children: ['basics/instruct.md', 'basics/class-and-style.md', 'basics/lifecycle.md', 'basics/computed.md', 'basics/watch.md'] 32 | }, 33 | { 34 | title: '进阶篇', 35 | collapsable: false, 36 | sidebarDepth: 2, 37 | children: ['advanced/components.md', 'advanced/filters.md', 'advanced/axios.md'] 38 | }, 39 | ], 40 | repo: 'shiyutim/start-from-scratch-learn-Vue', 41 | lastUpdated: '上次更新' 42 | } 43 | } -------------------------------------------------------------------------------- /docs/.vuepress/components/v-model/example4.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 57 | 58 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/Button2-2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 37 | 38 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/Button2.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 37 | 38 | -------------------------------------------------------------------------------- /docs/.vuepress/components/computeds/example1-1.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 54 | 55 | 71 | -------------------------------------------------------------------------------- /docs/.vuepress/components/computeds/example1-2.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 56 | 57 | 73 | -------------------------------------------------------------------------------- /docs/advanced/axios.md: -------------------------------------------------------------------------------- 1 | # axios 2 | 3 | [[toc]] 4 | 5 | ## 介绍 6 | 7 | axios 是 Vue 官方推荐的 http 库,所以,我们都是通过 axios 进行发送 http 请求。axios 有[中文版官方文档](http://www.axios-js.com/docs/),不过这个文档很不中文,如果你英文不好,可以看这个[中文版文档](https://www.kancloud.cn/yunye/axios/234845)。 8 | 9 | ## 使用 10 | 11 | 使用方式有两种,一种方式通过`npm install axios`进行安装包。另一种方式通过 cdn 进行使用``。 12 | 13 | 如果你使用 vue-cli 构建的项目,输入`npm install axios -S`安装包进`package.json`文件的`dependencies`中。`dependencies`为我们开发和上线后需要使用的包。`devDependencies`为我们开发时需要使用的包。 14 | 15 | 使用 axios 发送 get 和 post 请求非常简单,不过,再次之前你可能需要了解一下`Promise`。如果你不了解也没关系,只需要照着格式写就可以了,不过,`Promise`是非常重要的异步处理方式,必须要会的哦。 16 | 17 | 同时,axios 的中文文档真是简单明了,所以应该都能看懂,其实就是照葫芦画瓢,唯一有问题的地方可能就是**跨域处理**了吧。 18 | 19 | ## get 请求 20 | 21 | 发送 get 请求 22 | 23 | ```js 24 | import axios from 'axios' 25 | 26 | axios 27 | .get('/user?ID=12345') // {1} 28 | .then(function(response) { 29 | // {2} 30 | console.log(response) 31 | }) 32 | .catch(function(error) { 33 | // {3} 34 | console.log(error) 35 | }) 36 | ``` 37 | 38 | 使用`axios.get`发送 get 请求,`{1}`处为 url,`{2}`处为成功的回调,`{3}`为错误的回调 39 | 40 | 如果要传递参数,可以添加可选的`params`: 41 | 42 | ```js 43 | import axios from 'axios' 44 | 45 | axios 46 | .get('/user', { 47 | params: { 48 | Id: 12345 49 | } 50 | }) 51 | .then(function(response) { 52 | console.log(response) 53 | }) 54 | .catch(function(error) { 55 | console.log(error) 56 | }) 57 | ``` 58 | 59 | ## post 请求 60 | 61 | 发送 post 请求 62 | 63 | ```js 64 | import axios from 'axios' 65 | 66 | axios 67 | .post('/user', { 68 | firstName: 'Fred', 69 | lastName: 'Flintstone' 70 | }) 71 | .then(function(response) { 72 | console.log(response) 73 | }) 74 | .catch(function(error) { 75 | console.log(error) 76 | }) 77 | ``` 78 | -------------------------------------------------------------------------------- /docs/.vuepress/components/computeds/example2-1.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 65 | 66 | 82 | -------------------------------------------------------------------------------- /docs/.vuepress/components/component/Button2-3.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 51 | 52 | -------------------------------------------------------------------------------- /docs/.vuepress/components/computeds/example1-3.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 64 | 65 | 81 | -------------------------------------------------------------------------------- /docs/basics/instructs/others.md: -------------------------------------------------------------------------------- 1 | # 其他指令 2 | 3 | [[toc]] 4 | 5 | ## 介绍 6 | 7 | 前面已经介绍了比较重要且常用的指令,剩下的指令在这里简单的介绍一下。 8 | 9 | ## v-text 10 | 11 | 正常使用模板插值时,使用`{{}}`的方式: 12 | 13 | ```html 14 | {{msg}} 15 | ``` 16 | 17 | 使用`v-text`的写法: 18 | 19 | ```html 20 | 21 | ``` 22 | 23 | 这俩种方式最终的效果是一样的。 24 | 25 | ## v-html 26 | 27 | 假设在 data 有如下变量: 28 | 29 | ```js 30 | msg: `Hello V-html` 31 | ``` 32 | 33 | 在使用`{ { msg } }`或`v-text="msg"`的时候,会原封不动的渲染出来: 34 | 35 | ```js 36 | Hello V-html 37 | ``` 38 | 39 | 但是我们的本意是渲染出一个``标签。所以 vue 提供了`v-html`,可以识别出 html 标签。 40 | 41 | ```html 42 | 43 | ``` 44 | 45 |
46 | Hello V-html 47 |
48 | 49 | ## v-clock 50 | 51 | 在加载页面的时候,页面会经过编译,然后渲染 dom。所以,如果加载过程比较慢的话,会看到模板语法的表达式,比如: 52 | 53 | ```html 54 |
{{ msg }}
55 | ``` 56 | 57 | 然后页面加载完之后,才能看到实际的值: 58 | 59 | ```html 60 |
Hello Vue!
61 | ``` 62 | 63 | 这样用户体验很不好。所以,vue 提供了`v-clock`,我们可以使用 css 规则来隐藏未编译的模板标签。 64 | 65 | ```html 66 |
{{msg}}
67 | 68 | 73 | ``` 74 | 75 | 这样设置后,用户便不会看到未经过编译的**模板标签**,而是一片空白,然后页面渲染完成后,便会恢复回来。 76 | 77 | ## v-once 78 | 79 | 顾名思义,v-once,使用在标签上,这个元素渲染一次后,就会变成**静态内容**,并被缓存起来。 80 | 81 | ```html 82 |
Hello Vue
83 | ``` 84 | 85 | 不过,**[官方文档有如下提示](https://cn.vuejs.org/v2/guide/components-edge-cases.html#%E9%80%9A%E8%BF%87-v-once-%E5%88%9B%E5%BB%BA%E4%BD%8E%E5%BC%80%E9%94%80%E7%9A%84%E9%9D%99%E6%80%81%E7%BB%84%E4%BB%B6)**: 86 | 87 | ::: danger 警告 88 | 89 | 再说一次,试着不要过度使用这个模式。当你需要渲染大量静态内容时,极少数的情况下它会给你带来便利,除非你非常留意渲染变慢了,不然它完全是没有必要的——再加上它在后期会带来很多困惑。例如,设想另一个开发者并不熟悉 v-once 或漏看了它在模板中,他们可能会花很多个小时去找出模板为什么无法正确更新。 90 | ::: 91 | 92 | ## v-pre 93 | 94 | 跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签,跳过大量没有指令的节点会加快编译。 95 | 96 | ```html 97 | {{ this will not be compiled }} 98 | ``` 99 | 100 | --- 101 | 102 | 返回上一页 103 | -------------------------------------------------------------------------------- /docs/basics/instructs/v-on.md: -------------------------------------------------------------------------------- 1 | # 事件监听 2 | 3 | [[toc]] 4 | 5 | ## 介绍 6 | 7 | [v-on](https://cn.vuejs.org/v2/guide/events.html)指令用于**监听 dom 事件**,可以触发表达式或函数。 8 | 9 | ## v-on 10 | 11 | 在前面小例子中,我们给申请按钮设置了一个监听事件:`@click="userInfo.isMember = 1"`。这里使用了简写形式,实际上为`v-on:click="userInfo.isMember = 1"`。表示*使用`v-on:`监听`click`事件,如果发生点击事件,则调用右边的表达式*。也就是把`userInfo.isMember`的值重新赋值为 1。 12 | 13 | 那么,除了可以监听`click`事件,还可以监听哪些呢?比如说: `keyup`(键盘按下事件)、`mouseover`(鼠标经过事件) 等等 dom 事件。除了监听 dom 事件还可以监听子组件传过来的事件,等到讲解组件一节时在详细说明。 14 | 15 | 上面也提到了我们可以使用简写的方式。`v-on:`指令可以简写为`@`,那么简写后的监听事件为`@click、@mouseover和@keyup`。 16 | 17 | ## 调用方法 18 | 19 | `v-on`除了可以调用表达式外(`@click="userInfo.isMember = 1"`),还可以调用方法(函数),比如`@click="submit"`,那么这个`submit`就是一个函数。下面我们详细说一下**函数**。 20 | 21 | 在 vue 中,一个函数是定义在`methods{}`中的,在前面几节中,我们初始化的模板里面并没有`methods:{}`一项。现在,我们可以添加这一项了,这里是存放函数的地方。 22 | 23 | ::: warning 注意 24 | 在 methods 后面写的是 `:{}`,而不是`()`,这里需要注意!一定不要弄混了。 25 | ::: 26 | 27 | ```html 28 | 41 | 42 | 59 | 60 | 61 | ``` 62 | 63 | 还是套用前面的例子(嘻嘻:grinning:),在此基础上,我们在`{1}`处添加了一个`methods:{}`。注意,这里的层级关系是 `data`和`methods`是同级的,每个层级之间以`,`分隔。 64 | 65 | 现在我们改造一下,不直接使用`click`调用表达式,改成调用方法。所以,我们首先改变一下`申请按钮`。 66 | 67 | ```html 68 | 69 | ``` 70 | 71 | 接下来我们定义一个函数: 72 | 73 | ```js 74 | // es6 写法 75 | methods: { 76 | submit () {} 77 | } 78 | 79 | // es5 写法 80 | methods: { 81 | submit: function() {} 82 | } 83 | ``` 84 | 85 | 定义好了函数后,测试一下是否设置好了,可以使用`console.log`进行测试。在函数内部添加如下代码: 86 | 87 | ```js 88 | submit() { 89 | console.log('click`) 90 | } 91 | ``` 92 | 93 | 在你点击`申请按钮`后,控制台打印了`click`,说明函数调用成功。接下来就是改变会员状态了,那么把以前写的`userInfo.isMember = 1`放到函数内部就可以了。 94 | 95 | ```js 96 | submit() { 97 | console.log('click') 98 | this.userInfo.isMember = 1 // {1} 99 | } 100 | ``` 101 | 102 | 注意,我们在 html 内联中定义`click`事件的时候,`userInfo`前面没有`this`,而在函数中,也就是`{1}`处,我们使用的是`this`。前面已经讲过,我们访问`data`里面数据的时候,需要通过`this`来访问。 103 | 104 | 这时候再点击`申请按钮`,可以看到已经自动改变了界面状态。 105 | 106 | ## 按键修饰符 107 | 108 | 按键修饰符可以添加在**事件名**的后面,以`.`进行分隔`@<事件名>.<修饰符>`。比如说,我们在提交表单的时候,用户在输入完成后,除了可以手动点击提交按钮外,还可以点击键盘的`enter`键来提交申请,那么这时候我们就可以使用`@keyup.enter`来调用函数。`keyup`为事件名,`enter`为修饰符,更多修饰符请参考[官方文档](https://cn.vuejs.org/v2/guide/events.html#%E6%8C%89%E9%94%AE%E4%BF%AE%E9%A5%B0%E7%AC%A6)。 109 | 110 | --- 111 | 112 | 返回上一页 113 | -------------------------------------------------------------------------------- /docs/basics/instructs/v-bind.md: -------------------------------------------------------------------------------- 1 | # v-bind 2 | 3 | [[toc]] 4 | 5 | ## 介绍 6 | 7 | `v-bind`指令用于动态的绑定一个或多个特性。比如说表达式,还记得我们在使用`v-for`的时候,在`key`的前面添加了一个`:`了吗,这个`:`就是`v-bind:`的简写方式。`v-bind:key="index"`,简写为`:key="index"` 8 | 9 | ## v-bind 10 | 11 | 调用方法就是在一个属性前面添加`v-bind:`或者`:`。以后我们都简写为`:`。 12 | 例子: 13 | 14 | - 绑定一个图片`src`属性: 15 | 16 | ```html 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 | ``` 30 | 31 | - 绑定一个 a 标签的`href`链接 32 | 33 | ```html 34 | 这是一个链接 35 | 36 | 43 | ``` 44 | 45 | - 绑定一个对象 46 | 47 | ```html 48 | 49 | 50 | 这是一个链接 51 | 52 | 59 | ``` 60 | 61 | - 绑定一个数组 62 | 63 | ```html 64 | 65 | 66 | 67 | 这是一个链接 68 | 69 | 81 | ``` 82 | 83 | ## 小例子 84 | 85 | ### 遍历渲染一组图片 86 | 87 | 一般来说,在渲染一组图片的时候,我们是通过`v-for`来进行遍历渲染的,搭配`v-bind`就能实现 动态的给``绑定 url。 88 | 这里给大家提供一组真实的图片链接,是通过我写的[小爬虫](https://github.com/shiyutim/crawler)爬取的。接口地址为: `https://easy-mock.com/mock/5e1aa4ff7f109b0caa4d2e26/learnvue/imglist`。 89 | 90 | 首先,我们进行如下初始化页面模板: 91 | 92 | ```html 93 | 98 | 99 | 110 | 111 | 112 | ``` 113 | 114 | 进行如上初始化后,先是通过接口获取到数据后,存入`data`里面的`imgList`,然后通过遍历`imgList`数组,把值“绑定”给 img 的 src 属性。 115 | 116 | ```html 117 | 127 | 128 | 155 | 156 | 163 | ``` 164 | 165 | - 这里同样通过`axios`获取数据,并通过 `{1}` 处进行赋值操作。 166 | - 通过`v-for="(item, index) in imgList"` 遍历数组。 167 | - 通过`:src="item"` 把这个数组的每一项(即每一个 url)动态的绑定到 src 上,完整写法为`v-bind:src="item"`。 168 | - `:key="index"`给每一个图片标识一个`key`属性,值为当前项的索引(即 0/1/2/3 ...),完整写法为`v-bind:key="index"`。 169 | 170 | 运行以上代码后,就会看到页面上出现了许多图片。 171 | 172 | --- 173 | 174 | 返回上一页 175 | -------------------------------------------------------------------------------- /docs/basics/watch.md: -------------------------------------------------------------------------------- 1 | # 侦听器 watch 2 | 3 | [[toc]] 4 | 5 | ## 介绍 6 | 7 | 侦听器 `watch` 可以用来监听一个数据的变化。`watch` 和 `computed`、`methods` 一样,都是一个对象。所以,他们都使用`:{}`的方式,并且处于同一级别。 8 | 9 | ```js 10 | 11 | data () { 12 | return { 13 | count: 0 14 | } 15 | } 16 | 17 | watch: { 18 | 19 | }, 20 | computed: { 21 | 22 | }, 23 | methods: { 24 | 25 | } 26 | ``` 27 | 28 | ## watch 29 | 30 | 我们知道,computed 里面添加的是一个**新值**,并且可以在任何地方使用。而 watch 里面添加的是一个已经存在的表达式(变量)。watch 的使用方式分为好几种,下面我们来具体说明一下: 31 | 32 | - 普通方式 33 | 34 | ```js 35 | computed: { 36 | count: (newValue, oldValue) { 37 | console.log('newValue', newValue) 38 | console.log('oldValue', oldValue) 39 | } 40 | } 41 | ``` 42 | 43 | 此时我们就已经设置好了对变量`count`进行了监听。如果`count`的值改变,那么会打印出对应的值。其中,`newValue`代表新值,`oldValue`代表旧值(newValue 和 oldValue 的名字可以随意更改,只代表第一个参数和第二个参数而已)。 44 | 45 | 比如说,`count`初始化为 0, 那么我们把`count = 1`。此时,`newValue`为 1,`oldValue`为 0。 46 | 47 | - 使用*方法* 48 | 49 | ```js 50 | methods: { 51 | countHandler: function(newValue, oldValue) { 52 | console.log('newValue', newValue) 53 | console.log('oldValue', oldValue) 54 | } 55 | } 56 | 57 | computed: { 58 | count: 'countHandler' 59 | } 60 | ``` 61 | 62 | 这种方式和上面是同样的效果。 63 | 64 | - 使用`handler`(deep) 65 | 66 | ```js 67 | computed:{ 68 | count: { 69 | handler: (newValue, oldValue) { 70 | ... 71 | }, 72 | deep: true 73 | } 74 | } 75 | ``` 76 | 77 | 注意这里有一个`depp`选项,官网中的解释如下: 78 | 79 | > 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深 80 | 81 | 正常来说,我们使用 watch 监听的是单个值,watch 能够正常使用。而如果是一个对象的话,那么 watch 只会监听到**内存地址**的改变,而监听不到对象里面值的改变。 82 | 83 | 假如有如下代码: 84 | 85 | ```js 86 | 87 | data () { 88 | return { 89 | obj: { 90 | name: 'tim' 91 | } 92 | } 93 | } 94 | 95 | watch: { 96 | obj: function(newVal, oldVal) { 97 | console.log('newVal', newVal) 98 | console.log('oldVal', oldVal) 99 | } 100 | } 101 | ``` 102 | 103 | 我们设置了对 obj 对象的监听,当我们改变 obj 时: 104 | 105 | ```js 106 | this.obj = { 107 | name: 'sam' 108 | } 109 | ``` 110 | 111 | 112 | 113 | 如上图所示,我们能够看到,控制台打印出了对应的信息,说明我们能够监听到。但是我们改变`obj`里面的值呢?我们把代码做一下改变: 114 | 115 | ```js 116 | this.obj.name = 'sam' 117 | ``` 118 | 119 | 现在我们再看一下控制台,发现没有任何打印信息出现,说明我们没有监听到`name`属性。实际上,我们对`obj`设置了`watch`,只是监听了它的内存地址,如果`obj`的内存地址改变了,`watch`才会响应。 120 | (有关内存地址,可以网上找一下`const`声明对象的原理) 121 | 122 | 那么我们想要监听到`obj`里面的属性,或者说监听`name`属性,我们有两种方法: 123 | 124 | 1. 其一是,如上面所示,我们可以给`watch`的`obj`里面添加`deep: true`这一条属性,代表我们进行深度监听。但是`obj`里面的任何值改变,该函数都会执行。 125 | 126 | 加上了`deep: true`属性后,发现控制台打印出了对应的`newVal`和`oldVal`了。 127 | 128 | 2. 其二是,对`name`属性进行单独的监听,可以进行如下设置: 129 | 130 | ```js 131 | computed: { 132 | 'obj.name': function(newVal, oldVal) { 133 | // ... 134 | } 135 | } 136 | ``` 137 | 138 | 这样,只要`obj.name`的值改变,才会执行对应的函数! 139 | 140 | - 使用*方法*(immediate) 141 | 142 | ```js 143 | computed: { 144 | count: { 145 | handler: function(newVal, oldVal) {}, 146 | immediate: true 147 | }, 148 | } 149 | ``` 150 | 151 | 可以看到,我们又换了一个属性`immediate`,什么意思呢?来自官网的解释如下: 152 | 153 | > 该回调将会在侦听开始之后被立即调用 154 | 155 | 这里比较好理解,意思就是,设置监听后,会立马调用监听的函数。正常来说,最开始的几种方法在页面加载完毕后,都不会打印`newVal`。而设置了`immediate`属性后,页面加载完毕控制台就会打印出`newVal`。 156 | 157 | 还有其他方法请查看[官方文档](https://cn.vuejs.org/v2/api/#watch) 158 | 159 | 以上说了一大堆方法可能大家有点蒙,别着急,目前我日常使用过程中,比较常用的就是: 160 | 161 | ```js 162 | 163 | computed: { 164 | count(newVal, oldVal) { 165 | // ... 166 | } 167 | // 或者 168 | 'obj.name'(newVal, oldVal){ 169 | // ... 170 | } 171 | } 172 | ``` 173 | 174 | 侦听器固然好用,但是也会造成滥用,那么[官方文档](https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7-vs-%E4%BE%A6%E5%90%AC%E5%B1%9E%E6%80%A7)里面有对应的例子,这里就不在细说了。 175 | -------------------------------------------------------------------------------- /docs/introduction/introduce.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | [[toc]] 4 | 5 | ## 模板语法 6 | 7 | 在官网文档开始介绍的开头,有这么一句话 8 | 9 | > Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: 10 | 11 | 单单这一句话就有好几个名词,简化一下可以这么理解: 12 | 13 | vue.js 允许采用模板语法(`{{}}`)来将数据渲染进 DOM 里。 14 | 15 | ```html 16 |
17 | {{message}} 18 |
19 | ``` 20 | 21 | ```js 22 | var app = new Vue({ 23 | el: '#app', 24 | data: { 25 | message: 'Hello Vue!' 26 | } 27 | }) 28 | ``` 29 | 30 | 上例来自于官网,可以看出,官网都是基于引入 CND 的方式来举的例子,即引入 vue 的` 58 | 59 | 60 | ``` 61 | 62 | 那么上例可以重写为: 63 | 64 | ```html 65 | 68 | 69 | 78 | 79 | 80 | ``` 81 | 82 | 注意这里有点区别,在 vue 项目里,每个页面都是由一个或多个`.vue`文件组成的,而每个`.vue`文件里面,分别由`