前端与后端是什么?

前端:数据展示
后端:数据处理

依赖包从哪里来?

npm管理
npm 的服务器是在国外的 国内下载很慢
淘宝镜像: npm i -g cnpm —registry=https://registry.npm.taobao.org
jquery :
1.cd 到你要下载是的文件夹下
2.初始化 npm init -y
3.下载 npm install —save jquery
4.修改下载版本
4-1 在下载的时候直接指定版本 npm install —save jquery@版本号
4-2 可以在项目的package.json文件进行修改 在项目下使用 npm install 进行重新下载

框架是什么?

与业务无关的代码块
业务:就是项目的功能
框架优缺点
简化了项目的复杂度 提高了项目的价值
缺点:你要学习一套新的语法

html属性是什么?

扩展html标签的功能
语法:
属性写在html的 开标签中 属性=“属性值 ” 多个属性用空格隔开

什么是vue

vue.js是现今最为主流的 前端 MVVM框架 (更简单的来展示数据)

MVVM是什么?

M Model 模型——-》数据
V View 视图——-》用户可以看见的界面
Vm ViewModel 视图模型——-》数据与展示相分离 视图于模型之间的桥梁 用来关联

helloword

1.下载vue依赖
npm install —save vue
2.编写代码

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <!-- M 模型
  4. V 视图
  5. VM 视图模型 -->
  6. <!-- 1.创建v -->
  7. <div id="demoDiv">
  8. {{text}}
  9. </div>
  10. <script>
  11. // 2.vm层 就是vue实例
  12. new Vue({
  13. // 3.创建m层
  14. data:{
  15. text:"你好么么哒"
  16. },
  17. el:"#demoDiv"
  18. })
  19. </script>
  20. </body>

{{}}是什么?

{{}} 模板语法/双大括号表达式/双大括号赋值法

语法

{{ 表达式 }} 表达式 —-》 通过计算可以得到结果的公式

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <div id="demoDiv">
  4. <h1>{{name}}</h1>
  5. <h1>{{age+2}}</h1>
  6. <h1>{{sex?"你好":"你坏"}}</h1>
  7. <h1>{{arr[2]}}</h1>
  8. <h1>{{love.userb}}</h1>
  9. <h1>{{text}}</h1>
  10. <h1>{{text.toUpperCase()}}</h1>
  11. <h1>{{text.toUpperCase().substr(1,4)}}</h1>
  12. </div>
  13. <script>
  14. new Vue({
  15. data:{
  16. name:"xixi",
  17. age:18,
  18. sex:false,
  19. arr:[1111,22222,33333,44444],
  20. love:{
  21. usera:"aaaa",
  22. userb:"bbbbb"
  23. },
  24. text:"abcdefghijk"
  25. },
  26. el:"#demoDiv"
  27. })
  28. </script>
  29. </body>

渲染分类

vue 的核心就是可以使用简单简洁的模板语法来声明式的对数据进行展示。
原生js :命令式渲染 我们需要去命令我们的程序 你应该一步一步怎么走
vue框架 :声明式渲染 我们只需要告诉程序你要干什么 他就自己完成了

指令

指令概念

就是用v- 前缀的html特殊属性

指令的作用是什么?

在vue中 扩展html标签的功能

指令的语法

写在html的开标签中 并且 v-指令=“指令值” 多个指令用空格隔开

v-show

作用:控制元素的显示和隐藏
使用css的display来进行css的设置
true 显示 false 隐藏

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <div id="demoDiv">
  4. <h1>v-show</h1>
  5. <!-- 作用:控制元素的显示和隐藏
  6. 使用cssdisplay来进行css的设置
  7. true 显示 false 隐藏 -->
  8. <h1 v-show="bool">看我的显示和隐藏</h1>
  9. </div>
  10. <script>
  11. new Vue({
  12. data:{
  13. bool:true
  14. },
  15. el:"#demoDiv"
  16. })
  17. </script>
  18. </body>

v-model

用于在表单元素上进行数据的双向绑定

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <div id="demoDiv">
  4. <h1>v-model</h1>
  5. <!-- 表单元素上双向绑定 -->
  6. <!-- 双向绑定 模型变视图变 视图变模型也会变-->
  7. <!-- 1.模型数据绑定到了视图之上 -->
  8. <!-- 2.视图的数据改变了 模型也会跟着变 -->
  9. <input type="text" v-model="text"/>
  10. <p>{{text}}</p>
  11. </div>
  12. <script>
  13. new Vue({
  14. data:{
  15. text:"你好么么哒"
  16. },
  17. el:"#demoDiv"
  18. })
  19. </script>
  20. </body>

双向绑定的原理

双向绑定 是通过 数据劫持发布者订阅者模式来实现的

数据劫持:数据拦截 数据阻断 就是vm层会时时刻刻的监听者模型和视图中的数据当其中一个改变了 vm层就会收到通知(vm怎么收到的通知 通过数据劫持 Object.defineProperty() 他可以拦截 所绑定的对象数据 然后通过其中是的getter和setter方法来实现 读取与修改)
发布者订阅者 就是一个一对多的关系

v-on

就是在vue中绑定事件的指令 (在vue中不能直接使用事件 必须使用v-on修饰才能使用)

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <div id="demoDiv">
  4. <h1>v-on</h1>
  5. <button v-on:click="fun()">点我打印你好</button>
  6. <!-- 简写 -->
  7. <button @click="fun()">简写方式绑定事件</button>
  8. </div>
  9. <script>
  10. new Vue({
  11. data:{
  12. },
  13. el:"#demoDiv",
  14. // 函数需要写在与el data同级的位置 使用methods来表示
  15. methods:{
  16. fun(){
  17. console.error("你好")
  18. }
  19. }
  20. })
  21. </script>
  22. </body>

v-for

便利data数据 并且进行页面数据展示
语法:
v-for=” (v,i) in 你要便利的数据 “
v 就是便利出来的值
i 就是便利出来的下标

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. <body>
  3. <div id="demoDiv">
  4. <h1>v-for</h1>
  5. <ul>
  6. <li v-for="(item,index) in arr">{{item}}------{{index}}</li>
  7. </ul>
  8. </div>
  9. <script>
  10. new Vue({
  11. data:{
  12. arr:["VN","EZ","NOC","MF"]
  13. },
  14. el:"#demoDiv"
  15. })
  16. </script>
  17. </body>

便利复杂数据

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-for</h1>
  4. <ul>
  5. <li v-for="(item,index) in arr">{{item}}------{{index}}</li>
  6. </ul>
  7. <table border="1">
  8. <tr v-for="(v,i) in obj">
  9. <td>{{v.name}}</td>
  10. <td>{{v.age}}</td>
  11. </tr>
  12. </table>
  13. </div>
  14. <script>
  15. new Vue({
  16. data:{
  17. arr:["VN","EZ","NOC","MF"],
  18. obj:[
  19. {name:"xixi1",age:181},
  20. {name:"xixi2",age:182},
  21. {name:"xixi3",age:183},
  22. {name:"xixi4",age:184},
  23. {name:"xixi5",age:185}
  24. ]
  25. },
  26. el:"#demoDiv"
  27. })
  28. </script>
  29. </body>

v-bind 初学者最容易忘记的一个

给html标签的属性绑定变量

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-bind</h1>
  4. <a v-bind:href="ahref">{{atext}}</a>
  5. <!-- 简写 -->
  6. <a :href="ahref">{{atext}}</a>
  7. </div>
  8. <script>
  9. new Vue({
  10. data:{
  11. atext:"点我去百度",
  12. ahref:"http://www.baidu.com"
  13. },
  14. el:"#demoDiv"
  15. })
  16. </script>
  17. </body>

v-if v-else v-else-if

v-if 判断当前内容是否加载
指令值:true 加载 false不加载

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-if</h1>
  4. <input type="checkbox" v-model="bool"/>
  5. <h1 v-show="bool">看我是否显示v-show</h1>
  6. <h1 v-if="bool">看我是否显示v-if</h1>
  7. </div>
  8. <script>
  9. new Vue({
  10. el:"#demoDiv",
  11. data:{
  12. bool:true
  13. },
  14. methods:{
  15. }
  16. })
  17. </script>
  18. </body>

v-if 与 v-show的区别

相同点 : 从用户的角度都是对内容可以隐藏
不同点 :v-show 是通过css来对元素进行显示和隐藏 但是v-if 是对dom进行添加和删除
v-show 通常使用在对安全性不高的地方 它在初始化的时候对性能有影响 在频繁切换的时候对性能比较友好
v-if 用在对安全性较高的地方 对初始化的性能比较友好 在频繁切换的时候对性能比较差
v-else
必须配合v-if来使用 不能单独使用
当v-if不符合的时候 v-else的内容显示

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-else</h1>
  4. <h1 v-if="bool">请登录</h1>
  5. <!-- <p>我是站位的一个没用的内容</p> -->
  6. <h1 v-else>欢迎您尊敬的vip</h1>
  7. </div>
  8. <script>
  9. new Vue({
  10. el:"#demoDiv",
  11. data:{
  12. bool:false
  13. },
  14. methods:{
  15. }
  16. })
  17. </script>
  18. </body>

v-else-if
当其中一项成立的时候就加载那个元素显示

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-else-if</h1>
  4. <h1 v-if="num==1">111111111</h1>
  5. <h1 v-else-if="num==2">111111112</h1>
  6. <h1 v-else-if="num==3">111111113</h1>
  7. <h1 v-else>111111114</h1>
  8. </div>
  9. <script>
  10. new Vue({
  11. el:"#demoDiv",
  12. data:{
  13. num:222222
  14. },
  15. methods:{
  16. }
  17. })
  18. </script>
  19. </body>

v-text

向网页中插入纯文本 {{}} 和v-text的作用基本相同

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-text</h1>
  4. <h1 v-text="text"></h1>
  5. </div>
  6. <script>
  7. new Vue({
  8. el:"#demoDiv",
  9. data:{
  10. text:"我是一段字符串"
  11. },
  12. methods:{
  13. }
  14. })
  15. </script>
  16. </body>

小扩展—-屏幕闪烁/屏幕闪动

就是因为网速或者是用户的设备加载过慢 在vue还没有渲染内容的是时候页面就显示了 可能在用户的界面中出现很多{{}}然后突然间 加载出来了页面由变得正常了
解决方式
1.v-text
2.v-cloak 在vue关联处理完数据之后进行加载

  1. <body>
  2. <div id="demoDiv" v-cloak>
  3. <h1>v-text</h1>
  4. <h1 v-text="text"></h1>
  5. <h1>{{text}}</h1>
  6. </div>
  7. <script>
  8. new Vue({
  9. el:"#demoDiv",
  10. data:{
  11. text:"我是一段字符串"
  12. },
  13. methods:{
  14. }
  15. })
  16. </script>
  17. </body>

v-html

把字符串标签 解析到页面中

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-html</h1>
  4. <div>
  5. {{demohtml}}
  6. </div>
  7. <div v-html="demohtml"></div>
  8. </div>
  9. <script>
  10. new Vue({
  11. el:"#demoDiv",
  12. data:{
  13. demohtml:"<em>我是斜体</em>"
  14. },
  15. methods:{
  16. }
  17. })
  18. </script>
  19. </body>

v-once

数据一次性绑定

  1. <body>
  2. <div id="demoDiv">
  3. <h1>v-once</h1>
  4. <input type="text" v-model="text">
  5. <h1>{{text}}</h1>
  6. <h1>{{text}}</h1>
  7. <h1 v-once>{{text}}</h1>
  8. <h1>{{text}}</h1>
  9. <h1>{{text}}</h1>
  10. <h1>{{text}}</h1>
  11. </div>
  12. <script>
  13. new Vue({
  14. el:"#demoDiv",
  15. data:{
  16. text:"我是数据"
  17. },
  18. methods:{
  19. }
  20. })
  21. </script>
  22. </body>

watch监听器

watch就是用来监听data中的数据的 当监听的data数据改变了 那么watch就会自动触发
watch在初始化不会执行
语法:
写在与el data methods等同级的位置
watch:{
你要监听的数据(newval,oldval){
当监听的数据改变了你要操作的逻辑
}
}

计算属性 computed

引子
在没有计算属性的时候 如果我们需要对数据进行一些操作 那么我们可以把这些操作放到{{}}中进行处理

  1. <body>
  2. <div id="demoDiv">
  3. <h1>正常展示:{{text}}</h1>
  4. <h1>大写展示:{{text.toUpperCase()}}</h1>
  5. <h1>大写加截取展示:{{text.toUpperCase().substr(1,4)}}</h1>
  6. </div>
  7. <script>
  8. new Vue({
  9. el:"#demoDiv",
  10. data:{
  11. text:"abcdefghijk"
  12. },
  13. methods:{
  14. },
  15. watch:{
  16. }
  17. })
  18. </script>
  19. </body>

注意:
上面的写法没有问题 但是我们把大量的逻辑放到了{{}}中会导致后期代码可读性和可维护性非常低 而且{{}}中在实际开发中主要就是用来展示数据的 并不是用来处理数据的
其实我们可以把一条数据在不同位置展示不同形态 计算属性中来完成

什么是计算属性 computed?

计算(处理数据)属性(就是vue实例中的一个属性) vue实例中可以计算数据处理数据的一个属性计算属性他是依赖data数据的 当依赖的数据改变了 计算属性会重新计算这个数据并且返回计算之后的新结果
语法:
写在与 el data methods watch等同级位置
computed:{
你计算之后返回结果的变量(){
必须有return 你处理数据的逻辑
}
}

  1. <body>
  2. <div id="demoDiv">
  3. <h1>正常展示:{{text}}</h1>
  4. <h1>大写展示:{{text.toUpperCase()}}</h1>
  5. <h1>大写加截取展示:{{text.toUpperCase().substr(1,4)}}</h1>
  6. <hr>
  7. <h1>计算属性来处理上面的业务</h1>
  8. <h1>正常展示:{{text}}</h1>
  9. <h1>大写展示:{{uppertext}}</h1>
  10. <h1>大写加截取展示:{{upperstrtext}}</h1>
  11. </div>
  12. <script>
  13. new Vue({
  14. el:"#demoDiv",
  15. data:{
  16. text:"abcdefghijk"
  17. },
  18. methods:{
  19. },
  20. watch:{
  21. },
  22. // 计算属性
  23. computed:{
  24. uppertext(){
  25. return this.text.toUpperCase()
  26. },
  27. upperstrtext(){
  28. return this.text.toUpperCase().substr(1,5)
  29. }
  30. }
  31. })
  32. </script>
  33. </body>

计算属性与方法的区别

计算属性是基于依赖缓存的 也就是说 计算属性处理数据只会处理一次 如果你多次调用的话 那么她只会给你返回第一次处理之后存储在内存中的内容
方法 只要被调用那么就执行
计算属性依赖缓存相对于方法来说更加节省资源性能

计算属性与watch有什么区别

计算属性:在computed中 他是把data的数据变成自己依赖的数据 当这个数据改变了计算属性会重新计算这个依赖的数据并且返回处理之后的结果
watch:在watch中 他是监听一个data的数据 当这个数据改变了 他会完成一些业务操作

事件对象

谁触发了这个事件 事件对象就指向谁
$event 事件对象

  1. <body>
  2. <div id="demoDiv">
  3. <input type="text" @keydown="fun($event)">
  4. </div>
  5. <script>
  6. new Vue({
  7. el:"#demoDiv",
  8. data:{
  9. },
  10. methods:{
  11. fun(e){
  12. console.log(e)
  13. }
  14. },
  15. watch:{
  16. },
  17. computed:{
  18. }
  19. })
  20. </script>
  21. </body>

修饰符

就是帮助我们可以更简单的在事件实现的过程中处理一些基本的操作
语法:
@事件.修饰符=“函数()”

按键修饰符

可以对键盘事件进行简化
.up .down .ctrl .enter .space等等

  1. <body>
  2. <div id="demoDiv">
  3. <input type="text" @keydown.ctrl="fun()">
  4. </div>
  5. <script>
  6. new Vue({
  7. el:"#demoDiv",
  8. data:{
  9. },
  10. methods:{
  11. fun(){
  12. console.log("aaaaaaaa")
  13. }
  14. },
  15. watch:{
  16. },
  17. computed:{
  18. }
  19. })
  20. </script>
  21. </body>

事件修饰符

阻止事件默认行为 : .prevent
阻止冒泡: .stop
事件捕获: .captrue
事件只触发一次: .once

  1. <body>
  2. <div id="demoDiv">
  3. <div class="fu" @click.once="fu()">
  4. <div class="zi" @click.stop="zi()">
  5. </div>
  6. </div>
  7. </div>
  8. <script>
  9. new Vue({
  10. el:"#demoDiv",
  11. data:{
  12. },
  13. methods:{
  14. fu(){
  15. console.log("福福福福福福")
  16. },
  17. zi(){
  18. console.log("滋滋滋滋滋滋滋滋滋")
  19. }
  20. },
  21. watch:{
  22. },
  23. computed:{
  24. }
  25. })
  26. </script>
  27. </body>

生命周期的钩子函数

钩子函数
在特定情况下被自定钩起的函数(自动调用的函数)
vue的生命周期
vue实例从创建到销毁的过程
生命周期的钩子函数
vue实例从创建到销毁的过程中被自动调用的函数
生命周期的钩子函数:
1.实例创建前后
实例创建之前: beforeCreate 数据观测和初始化并没有开始
实例创建之后: created 完成了数据的观测 属性方法等内容都开始初始化 但是这个时候视图层还没有开始渲染
2.模板渲染前后
模板渲染之前: beforeMount 模板开始准备被渲染 但是还没有渲染
模板渲染之后: mounted el已经被vue实例挂在并且页面的dom也进行了渲染
3.数据更新前后
数据更新之前: beforeUpdate 在数据更新之前被调用 这个时候是准备开始更新
数据更新之后: updated 数据更新之后调用并且页面重新渲染展示修改之后的内容
4.实例销毁前后
实例销毁之前:beforeDestroy
实例销毁之后:destoroyed
vue首次加载的时候之前前两组4个钩子

过滤器

在vue中过滤器使用 filter来表示
在不改变原始数据的情况下 格式化(按照我们的需要)展示内容
过滤器本应该分为自定义过滤器和内置过滤器 但是在vue2.x之后取消了内置过滤器 内置过滤器只停留在1.x之中

自定义过滤器

全局与局部的概念

  1. <body>
  2. <h1>全局和局部的改变</h1>
  3. <!-- 全局就是一个内容可以在任意区域都可以使用
  4. 局部只能在局部范围内使用 -->
  5. <div id="demodiv">
  6. 11111{{text}}
  7. </div>
  8. <div id="demodivb">
  9. 22222{{text}}
  10. </div>
  11. <script>
  12. new Vue({
  13. el:"#demodiv",
  14. data:{
  15. text:"你好么么哒"
  16. }
  17. })
  18. new Vue({
  19. el:"#demodivb",
  20. data:{
  21. }
  22. })
  23. </script>
  24. </body>

全局过滤器

全局过滤器在任意位置都可以使用
语法:
定义在vue实例之前
Vue.filter(“当前过滤器的名字”,(你要过滤的数据)=>{
必须return 你过滤这个数据的逻辑
})
定义过滤器

  1. <body>
  2. <h1>全局过滤器</h1>
  3. <div id="demodiv">
  4. <h1>{{num}}</h1>
  5. </div>
  6. <div id="demodivb">
  7. <h1>{{num}}</h1>
  8. </div>
  9. <script>
  10. // 全局过滤器
  11. Vue.filter("xiaoming",(data)=>{
  12. return data.substr(0,10)
  13. })
  14. new Vue({
  15. el:"#demodiv",
  16. data:{
  17. num:"2017-03-12 22:48:56"
  18. }
  19. })
  20. new Vue({
  21. el:"#demodivb",
  22. data:{
  23. num:"2017-03-14 13:30:39"
  24. }
  25. })
  26. </script>
  27. </body>

使用过滤器
{{变量| 过滤器的名字 }}

  1. <div id="demodiv">
  2. <h1>{{num|xiaoming}}</h1>
  3. </div>
  4. <div id="demodivb">
  5. <h1>{{num|xiaoming}}</h1>
  6. </div>

局部过滤器

只能在创建过滤器的这个实例中进行使用
语法:
写在指定实例的el methods watch 等同级位置 使用 filters来进行定义
filters:{
过滤器的名字(你要过滤器的数据){
必须return 你过滤的逻辑
}
}

  1. <body>
  2. <h1>局部的过滤器</h1>
  3. <div id="demodiv">
  4. {{num}}
  5. </div>
  6. <div id="demodivb">
  7. {{num|xiaoming}}
  8. </div>
  9. <script>
  10. new Vue({
  11. el:"#demodiv",
  12. data:{
  13. num:"2017-03-12 22:48:56"
  14. }
  15. })
  16. new Vue({
  17. el:"#demodivb",
  18. data:{
  19. num:"2017-03-14 13:30:39"
  20. },
  21. filters:{
  22. xiaoming(data){
  23. return data.substr(0,10)
  24. }
  25. }
  26. })
  27. </script>
  28. </body>

脚手架

什么是脚手架

在vue中 脚手架使用的是 vue-cli这个技术
脚手架 就是一个今后所写项目的一个基本的空框架 这个空框架中包含了 与项目业务无关的空框框
创建:
前期准备:电脑上必须药有node 建议页安装好淘宝镜像
1.全局安装 npm install -g @vue/cli
2.查看安装之后的脚手架版本 vue —version
3.把cmd cd到你要创建项目的路径下
4.创建项目 vue create 项目名
5 把路径cd到你创建的项目下
6.启动项目 npm run serve

.vue文件——单文件组件

在一个.vue文件中有三个部分
1.template html部分写在template中
2.script 就是用来写js相关的代码 data methods watch computed等等
3.style 就是用来编写组件的样式

拿到空的脚手架项目之后怎么办?

1.点开src文件夹 找到components文件夹 删除其中的helloword.vue
2.在components文件夹中创建一个属于我们自己的.vue文件 在其中把template script style补齐

  1. <template>
  2. <div>
  3. <h1>你好我是第一个vue文件1</h1>
  4. <h1>你好我是第一个vue文件2</h1>
  5. <h1>你好我是第一个vue文件3</h1>
  6. <h1>你好我是第一个vue文件4</h1>
  7. <h1>你好我是第一个vue文件5</h1>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. }
  13. </script>
  14. <style>
  15. </style>

3.到app.vue(所有组件的老大 不能删)中修改 原有的配置

  1. <template>
  2. <div id="app">
  3. <img alt="Vue logo" src="./assets/logo.png">
  4. <!-- 3.设置成我们自己的 -->
  5. <Demo/>
  6. </div>
  7. </template>
  8. <script>
  9. // 1.修改下面的引用 把原来的helloword 路径改成我们自己创建的
  10. // 首字母必须大写
  11. import Demo from './components/demo.vue'
  12. export default {
  13. name: 'App',
  14. components: {
  15. // 2。修改引用的名字为我们创建的
  16. Demo
  17. }
  18. }
  19. </script>
  20. <style>
  21. #app {
  22. font-family: Avenir, Helvetica, Arial, sans-serif;
  23. -webkit-font-smoothing: antialiased;
  24. -moz-osx-font-smoothing: grayscale;
  25. text-align: center;
  26. color: #2c3e50;
  27. margin-top: 60px;
  28. }
  29. </style>

4.在app.vue中删除图片与默认样式

  1. <template>
  2. <div id="app">
  3. <!-- 4.删除默认欢迎图片 -->
  4. <!-- <img alt="Vue logo" src="./assets/logo.png"> -->
  5. <!-- 3.设置成我们自己的 -->
  6. <Demo/>
  7. </div>
  8. </template>
  9. <script>
  10. // 1.修改下面的引用 把原来的helloword 路径改成我们自己创建的
  11. // 首字母必须大写
  12. import Demo from './components/demo.vue'
  13. export default {
  14. name: 'App',
  15. components: {
  16. // 2。修改引用的名字为我们创建的
  17. Demo
  18. }
  19. }
  20. </script>
  21. <style>
  22. /* 5.删除默认样式 */
  23. /* #app {
  24. font-family: Avenir, Helvetica, Arial, sans-serif;
  25. -webkit-font-smoothing: antialiased;
  26. -moz-osx-font-smoothing: grayscale;
  27. text-align: center;
  28. color: #2c3e50;
  29. margin-top: 60px;
  30. } */
  31. </style>

扩展—- 自动开启浏览器

1.在vue项目的根路径下根路径下根路径下根路径下根路径下根路径下根路径下 创建一个vue.config.js
2.在其中编写

  1. module.exports={
  2. devServer:{
  3. open:true
  4. }
  5. }

3.重启项目

组件

把页面中多次重现 或者是 可以复用的内容 封装起来 在复用的时候只需要重读调用 二部需要重写的一个技术叫做组件
组件就是用来提高代码的复用性 减少代码量 提高开发速度 降低后期维护难度
组件的本质是 自定义标签

创建组件

全局组件—component

局部组件—components

只能在局部进行使用的组件
创建
1.需要在components文件家中创建一个.vue文件 并写入内容
2.使用组件
(1) 引用 import 首字母大写 from “引用文件的路径”
(2)调用 需要与data methods watch 等同级位置 使用components来进行表示
语法:
components:{
给引用的组件起个名字: 你要用的组件
}
(3)使用 把组件当做标签在template中进行使用

组件的坑与使用

坑1 组件中有多个标签

在vue的组件中 如果你要有多行标签那么必须把这多行标签 使用一个父组件包裹(就是在template中只能有一个根节点)

  1. <template>
  2. <div>
  3. <!-- 多行标签必须要有一个根节点 -->
  4. <div>
  5. 我是测试组件中有多个标签的例子
  6. </div>
  7. <div>
  8. 我是测试组件中有多个标签的例子
  9. </div>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. }
  15. </script>
  16. <style>
  17. </style>

坑2 组件之间的样式污染—scoped

scoped 当前样式仅对当前组件生效

  1. <style scoped>
  2. /* scoped 当前样式仅对当前组件生效 */
  3. h1{
  4. color:red;
  5. }
  6. </style>

坑3 vue指令v-for需要加key属性

key 是在vue使用v-for的时候添加的一个属性 它的作用就是给遍历出来的内容添加一个唯一标识 因为有了这个唯一的名字之后 vue在处理这些新遍历出来的数据 效率更高

  1. <template>
  2. <div>
  3. <h1>测试本地模式学习的属性---{{text}}</h1>
  4. <ul>
  5. <li v-for="(v,i) in arr" :key="i">{{v}}</li>
  6. </ul>
  7. </div>
  8. </template>

本地模式知识点使用

1.data属性 语法有区别

  1. data(){
  2. return {
  3. text:"我是字符串",
  4. num:18
  5. }
  6. }

自行查找 vue组件的data为什么是一个函数?

剩下的所有属性写法一模一样
2.methods属性
3.watch属性
4.computed属性
5.8个生命周期钩子
6.filters过滤器
7.components属性

父子组件

组件与组件之间有嵌套关系
就是按照组件使用的语法在一个组件中调用另外一个组件

组件作用域

我在父组件中创建一个变量 在子组件中呢直接使用吗?
不能直接用
我在子组件中创建一个变量 在父组件中呢直接使用吗?
不能直接用
组件是一个完整的独立的个体 数据与数据之间不能直接相互使用 父子不行 子父不行 爷孙更不行

组件传值

正向传值

父组件把数据给子组件
使用props来实现正向传值 props 就是组件中的一个开口 可以让数据在父子之间正向传递
语法:
写在与data merhods watch 等同级位置
props:[ “接收数据的变量1”,“接收数据的变量2”,………n ]
使用:
子组件定义接收参数

  1. <template>
  2. <div>
  3. ziziz
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. // 定义正向传值的接收数据
  9. props:["title","num"],
  10. data(){
  11. return {
  12. }
  13. }
  14. }
  15. </script>
  16. <style>
  17. </style>

父组件开始传递

  1. <Zi title="我是父组件传递的title数据" num="18"/>

props验证

就是在正向传值的时候对父组件传递过来的数据进行数据类型 默认值等 数据的格式效验
props验证不会影响页面的显示(哪怕验证的是错误的都不会影响页面显示 )但是会在控制台给我们开发者一个警告的错误提示
props验证上线后需要移除
语法:
props:{
接收参数:数据类型,
//如果我想验证接收参数可以是多个类型怎么办?
接收参数:[数据类型1,数据类型2]
//默认值呢?
接收参数:{
default:”你的默认值”
}
}

  1. props:{
  2. text:String,
  3. // num:Number
  4. // num:[String,Number]
  5. num:{
  6. default:"我是num的默认值",
  7. type:String//设置了默认值之后设置数据类型校验的写法
  8. }
  9. }

逆向传值

子组件把数据给父组件

同胞传值

平级组件之间传递数据

跨组件传值

爷孙组件 或者 更多层级之间的数据传递

数据请求

原生ajax与jquery的方式实现
vue-resource 是vue官方出品 vue2.0之后官方停止维护了
axios

axios

axios是一个第三方的数据请求 可以在vuer中使用 也可以在原生js中使用 也可以在今后学习的react等知识点中使用
axios 就是基于XHR对象 使用promise进行异步封装的一个扩展 的写法(让他更符合当下的语法要求)
axios.get()
axios.post()
axios({ })
使用:
1.下载 npm install —save axios
2.引用
3.使用

  1. mounted(){
  2. axios({
  3. url:"http://api.artgoer.cn:8084/artgoer/api/v1/user/324380/v3/topic/topicHomeByLabel?pageIndex=1&token=b544cd63-6d42-46fe-a96c-3cf96bae3113&topicId=62187",
  4. method:"get"
  5. }).then((ok)=>{
  6. console.log(ok)
  7. }).catch((err)=>{
  8. console.log(err);
  9. })
  10. }

axios拦截器

使用
1.下载axios
2.新建util文件夹 工具文件夹
3.新建api文件夹 用来封装数据请求的文件夹
4.在util中新建拦截器文件

  1. import axios from "axios"
  2. // 创建axios 赋值给常量service
  3. const service = axios.create();
  4. // 添加请求拦截器(Interceptors)
  5. service.interceptors.request.use(function (config) {
  6. // 发送请求之前做写什么
  7. return config;
  8. }, function (error) {
  9. // 请求错误的时候做些什么
  10. return Promise.reject(error);
  11. });
  12. // 添加响应拦截器
  13. service.interceptors.response.use(function (response) {
  14. // 对响应数据做点什么
  15. return response;
  16. }, function (error) {
  17. // 对响应错误做点什么
  18. return Promise.reject(error);
  19. });
  20. export default service

5.封装数据请求

  1. import service from "@/util/service.js"
  2. // 用来封装数据请求的文件
  3. let getlink=(url)=>{
  4. // 当我调用这个函数的时候需要让他返回一个promise对象(因为我们使用promise对象来封装我们的异步请求让他的可读性更高并且更符合当下语法主流)
  5. return new Promise((resolve,reject)=>{
  6. // 来写你的异步操作
  7. service.request({
  8. url,
  9. method:"GET"
  10. }).then((ok)=>{
  11. resolve(ok)
  12. }).catch((err)=>{
  13. reject(err)
  14. })
  15. })
  16. }
  17. export default getlink

6 在需要使用的组件内 调用api的请求 进行数据请求

  1. getlink("http://api.artgoer.cn:8084/artgoer/api/v1/user/324380/v3/topic/topicHomeByLabel?pageIndex=1&token=b544cd63-6d42-46fe-a96c-3cf96bae3113&topicId=62187").then((ok)=>{
  2. console.log(ok)
  3. }).catch((err)=>{
  4. console.log(err)
  5. })

跨域

因为浏览器的安全机制 同源策略引起的 同端口 同域名 同协议
如果数据请求出现如下错误 表示跨域了

  1. localhost/:1 Access to XMLHttpRequest at 'http://www.weather.com.cn/data/cityinfo/101320101.html' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

使用代理跨域即可解决
我们日常发送数据请求是通过浏览器进行发送的

代理跨域

1.在项目的根路径下 新建vue.config.js
2.编写如下内容

  1. module.exports={
  2. devServer:{
  3. open:true,
  4. // 设置跨域
  5. proxy:{
  6. "/api":{
  7. // target:"设置你要帮助跨域的地址"
  8. target:"http://www.weather.com.cn/",
  9. changeOrigin:true,
  10. ws:true,
  11. pathRewrite:{
  12. "^/api":""
  13. }
  14. }
  15. }
  16. }
  17. }

3.在组件的请求中 设置/api

  1. getlink("/api/data/cityinfo/101320101.html").then((ok)=>{
  2. console.log(ok)
  3. }).catch((err)=>{
  4. console.log(err);
  5. })