• vue2(1)


    目录

    vue简介

    初始Vue

     模板语法

    数据绑定

    data与el的2种写法

    MVVM模型

    Object.defineProperty方法

    数据代理

    事件的基本使用

    事件修饰符

    键盘事件

    姓名案例

    计算属性

    计算属性简写


    vue简介

    定义

    一套用于构建用户界面的`渐进式JS框架`

     

     特点

    1. 采用`组件化`模式,提高代码复用率,且让代码更好维护
    2. 声明式编码,让编码无需直接操作DOM,提高开发效率
    3. 使用`虚拟DOM+优秀的Diff算法`,尽量复用DOM节点

     要掌握的JS基础知识

    ES6语法规范,ES6模块化,包管理器,原型、原型链,数组常用方法,axios,promise

    初始Vue

    1. 想让Vue工作,就必须创建一个`Vue实例`,且要传入一个配置对象
    2. root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法
    3. root容器里的代码被称为vue模板
    4. Vue实例和容器是一一对应的
    5. 真实开发中只用一个Vue实例,并且会配合着组件一起使用
    6. {{XXX}}中的XXX要写js表达式,且XXX可以自动读取到data中的所有属性
    7. 一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>hello,{{name}}h1>
    13. div>
    14. <script>
    15. Vue.config.productionTip=false;//阻止vue在启动生成生产提示
    16. new Vue({
    17. el:'#root',//el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
    18. data:{//data用于存储数据,数据供el所指定的容器去只用,值暂时先写成一个对象
    19. name:'尚硅谷'
    20. }
    21. })
    22. script>
    23. body>
    24. html>

    注意区分:js表达式和js代码(语句)

    1.表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方

     2.js代码(语句)

     模板语法

    两大类

    1.插值语法

    • 功能:用于`解析标签体内容`
    • 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性

    2.指令语法

    • 功能:用于`解析标签`(包括:标签属性,标签体内容,绑定事件。。。)
    • 备注:Vue中有很多的指令,且形式都是:v-???
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>插值语法h1>
    13. <h3>你好,{{name}}h3>
    14. <hr>
    15. <h1>指令语法h1>
    16. <a :href="school.url.toUpperCase()" x="hello">点我去{{school.name}}学习1a>
    17. <a v-bind:href="school.url">点我去{{school.name}}学习2a>
    18. div>
    19. <script>
    20. Vue.config.productionTip=false
    21. new Vue({
    22. el:'#root',
    23. data:{
    24. name:'jack',
    25. school:{
    26. name:'shangguigu',
    27. url:'http://www.atguigu.com',
    28. }
    29. }
    30. })
    31. script>
    32. body>
    33. html>

    数据绑定

    2种方式

    1. 单向绑定(v-bind):数据只能从data流向页面
    2. 双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data

    备注:

    1. 双向绑定一般都应用在表单类元素上(如:input、select等)
    2. `v-model:value` 可以简写为`v-model`,因为v-model默认就是value的
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. 单向数据绑定:<input type="text" v-bind:value="name"><br>
    13. 双向数据绑定:<input type="text" v-model:value="name"><br>
    14. 单向数据绑定:<input type="text" :value="name"><br>
    15. 双向数据绑定:<input type="text" v-model="name"><br>
    16. <hr>
    17. div>
    18. body>
    19. <script>
    20. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    21. new Vue({
    22. el:'#root',
    23. data:{
    24. name:'aaa'
    25. }
    26. })
    27. script>
    28. html>

    data与el的2种写法

    1.`el`

    1. new Vue时配置el属性
    2. 先创建Vue实例,随后再通过`vm.$mount('#root')`指定el的值

    2.`data`

    1. 对象式
    2. 函数式

    如何选择:目前都可以,以后学习组件时,data必须用函数式,否则会报错

    3.一个重要的原则

    • 由Vue管理的函数,一定不要箭头函数,一旦写了箭头函数,this就不再是Vue实例了
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>你好,{{name}}h1>
    13. div>
    14. body>
    15. <script>
    16. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    17. const v=new Vue({
    18. el:'#root',//第一种写法
    19. data:{
    20. name:'尚硅谷'
    21. }
    22. })
    23. console.log(v);
    24. v.$mount('#root')//第二种写法
    25. //data的两种写法
    26. new Vue({
    27. el:'#root',
    28. // data:{
    29. // name:'shang'
    30. // }
    31. // 第二种写法
    32. data(){//data:function(){}
    33. name:'shang'
    34. }
    35. })
    36. script>
    37. html>

    MVVM模型

    1. M:`模型(Model)`:对应data中的数据
    2. V:`视图(View)`:模板
    3. VM:`视图模型(ViewModel)`:Vue实例对象

    `data Bindings`:数据保存在Model中,要将数据表现在页面中,得将数据通过数据绑定传到View上

    `DOM Listeners`:DOM监听,当在View中修改数据的时候,Model中的数据也会发生改变

     观察发现:

    1. data中所有的属性,最后都出现在了vm身上
    2. vm身上的属性及Vue原型上所有属性,在Vue模板中都可以直接使用

    Object.defineProperty方法

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <script>
    12. let number=18
    13. let person={
    14. name:'张三',
    15. sex:'男'
    16. }
    17. Object.defineProperty(person,'age',{
    18. value:18,
    19. enumerable:true,//控制属性是否可以枚举,默认值是false
    20. writable:true,//控制属性是否可以被修改,默认值是false
    21. configurable:true,//控制属性是否可以被删除,默认值是false
    22. // 当有人读取person的age属性,get函数(getter)
    23. // 就会被调用,且返回值就是age的值
    24. get(){
    25. console.log('有人读取age属性了')
    26. return number
    27. },
    28. set(value){
    29. console.log('有人修改了age属性,且值是',value);
    30. number=value
    31. }
    32. })
    33. script>
    34. body>
    35. html>

    数据代理

    通过一个对象代理对另一个对象中属性的操作(读/写)

     1.Vue中的数据代理

    • 通过vm对象来`代理data对象中属性`的操作(读/写)

    2.Vue中的数据代理的好处

    • 更加方便的操作data中的数据

    3.基本原理

    • 通过`Object.defineProperty()`把data对象中所有属性添加到vm中,为每一个添加到vm上的属性,都指定一个`getter/setter`内部去操作(读/写)data中对应的属性
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>学校名称:{{name}}h1>
    13. <h1>学校地址:{{address}}h1>
    14. div>
    15. body>
    16. <script>
    17. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    18. const vm=new Vue({
    19. el:'#root',
    20. data:{
    21. name:'atuigu',
    22. address:'北京'
    23. }
    24. })
    25. script>
    26. html>

    事件的基本使用

    1. 使用`v-on:xxx`或`@xxx`绑定事件,其中xxx是事件名
    2. 事件是回调需要配置在methods对象中,最终会在vm中
    3. methods中配置的函数,不要用箭头函数!否则this就不是vm了
    4. `@click="demo"`和`@click="demo(e)"`效果一致,但是后者可以传参
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>欢迎来到{{name}}h1>
    13. <button @click="showInfo">点我学习一下1(不传参)button>
    14. <button @click="showInfo2($event,666)">点我学习一下2(传参)button>
    15. div>
    16. body>
    17. <script>
    18. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    19. const vm=new Vue({
    20. el:'#root',
    21. data:{
    22. name:'atguigu'
    23. },
    24. methods:{
    25. showInfo(event){
    26. // alert('同学你好')
    27. // console.log(a,b,c,d)
    28. // console.log(event.target.innerText);
    29. // console.log(event.target);
    30. console.log(this);//vm
    31. },
    32. showInfo2(event,number){
    33. alert('同学你好!!')
    34. console.log(number,event);
    35. // console.log(a,b,c,d)
    36. // console.log(event.target.innerText);
    37. // console.log(event.target);
    38. // console.log(this);//vm
    39. }
    40. }
    41. })
    42. script>
    43. html>

    事件修饰符

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. <style>
    10. *{
    11. margin-top: 20px;
    12. }
    13. .demo1{
    14. height: 50px;
    15. background-color: #bfa;
    16. }
    17. .box1{
    18. height: 50px;
    19. background-color: #bfa;
    20. }
    21. .box2{
    22. height: 50px;
    23. background-color: skyblue;
    24. }
    25. style>
    26. head>
    27. <body>
    28. <div id="root">
    29. <h2>欢迎来到{{name}}h2>
    30. <a href="http://www.atguigu.com" @click.prevent="showInfo">点我提示信息a>
    31. <div class="demo1" @click="showInfo">
    32. <button @click.stop="showInfo">点我提示信息button>
    33. div>
    34. <div>
    35. <button @click.once="showInfo">点我提示信息button>
    36. div>
    37. <div class="box1" @click.capture="showMsg(1)">
    38. div1
    39. <div class="box2" @click="showMsg(2)">
    40. div2
    41. div>
    42. div>
    43. <div class="demo1" @click.self="showInfo">
    44. <button @click.once="showInfo">点我提示信息button>
    45. div>
    46. <ul @wheel.passive="demo" class="list">
    47. <li>1li>
    48. <li>2li>
    49. <li>3li>
    50. <li>4li>
    51. ul>
    52. div>
    53. body>
    54. <script>
    55. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    56. new Vue({
    57. el:'#root',
    58. data:{
    59. name:'guigu'
    60. },
    61. methods:{
    62. showInfo(e){
    63. alert('你好')
    64. // console.log(e.target);
    65. },
    66. showMsg(msg){
    67. console.log(msg);
    68. }
    69. }
    70. })
    71. script>
    72. html>

    键盘事件

    1.

    Vue中常用的按键别名
    回车enter
    删除delete
    退出esc
    空格space
    换行tab
    up
    down
    left
    right

    2.Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注定要转为kebab-case(短横线命名)

    3.系统修饰键(用法特殊):`ctrl`  `alt ` `shift`  `meta`

    1. 配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发
    2. 配合keydown使用:正常触发事件

    4.也可以使用`keyCode`去指定具体的按键(不推荐)

    5.`Vue.config.keyCodes.自定义键名=键名`,可以去指定按键别名

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h2>欢迎来到{{name}}h2>
    13. <input type="text" placeholder="按下回车提示输入" @keyup.13 ="showInfo">
    14. div>
    15. body>
    16. <script>
    17. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    18. // Vue.config.keyCodes.huiche=13//定义了一个别名按键
    19. new Vue({
    20. el:'#root',
    21. data:{
    22. name:'花京院'
    23. },
    24. methods:{
    25. showInfo(e){
    26. // if(e.keyCode!==13) return
    27. console.log(e.key,e.keyCode);
    28. console.log(e.target.value);
    29. }
    30. }
    31. })
    32. script>
    33. html>

    注意:

    1.修饰符可以连续写

    1. <div class="demo1" @click="showInfo">
    2. <a href="http://www.atguigu.com" @click.stop.prevent="showInfo">点我提示信息a>
    3. div>

    2.连按两个键

    1. <div id="root">
    2. <h2>欢迎来到{{name}}h2>
    3. <input type="text" placeholder="按下回车提示输入" @keyup.ctrl.y ="showInfo">
    4. div>

    姓名案例

    1.插值语法

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. 姓:<input type="text" v-model:value="firstname"><br><br>
    13. 名:<input type="text" v-model="lastname"><br><br>
    14. 姓名:<span>{{firstname.slice(0,3)}}-{{lastname}}span>
    15. div>
    16. body>
    17. <script>
    18. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    19. new Vue({
    20. el:'#root',
    21. data:{
    22. firstname:'张',
    23. lastname:'三'
    24. }
    25. })
    26. script>
    27. html>

    2.methods实现

    当数据发生改变,Vue会重新调用,重新解析

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. 姓:<input type="text" v-model:value="firstname"><br><br>
    13. 名:<input type="text" v-model="lastname"><br><br>
    14. 姓名:<span>{{fullname()}}span>
    15. div>
    16. body>
    17. <script>
    18. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    19. new Vue({
    20. el:'#root',
    21. data:{
    22. firstname:'张',
    23. lastname:'三'
    24. },
    25. methods:{
    26. fullname(){
    27. return this.firstname+'-'+this.lastname
    28. }
    29. }
    30. })
    31. script>
    32. html>

    计算属性

    1.定义:要用的属性不存在,要通过已有属性计算得来

    2.原理:底层借助了Object.defineproperty方法提供的getter和setter

    3.get什么时候调用?

    1. 初次读取fullName
    2. 所依赖的数据发生变化

    4.get的作用:当有人读取fullName时,get就会被调用,且返回值就作为fullName的值

    5.什么时候调用set?

    • 当fullName被修改

    6.优势:与methods实现相比,内部有缓存机制(复用),效率更高,雕塑方便

    5.备注

    1. 计算属性最终会出现再vm中,直接读取使用即可
    2. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算式依赖的数据发生改变
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. 姓:<input type="text" v-model:value="firstname"><br><br>
    13. 名:<input type="text" v-model="lastname"><br><br>
    14. 姓名:<span>{{fullName}}span><br><br>
    15. 姓名:<span>{{fullName}}span><br><br>
    16. 姓名:<span>{{fullName}}span><br><br>
    17. 姓名:<span>{{fullName}}span><br><br>
    18. div>
    19. body>
    20. <script>
    21. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    22. let a=1
    23. const vm=new Vue({
    24. el:'#root',
    25. data:{
    26. firstname:'张',
    27. lastname:'三',
    28. x:'你好'
    29. },
    30. methods:{
    31. demo(){
    32. }
    33. },
    34. computed:{
    35. fullName:{
    36. get(){
    37. console.log('get被调用了');
    38. // console.log(this);//vue
    39. return this.firstname+'-'+this.lastname
    40. },
    41. set(value){
    42. console.log('set',value);
    43. const arr=value.split('-')
    44. this.firstname=arr[0]
    45. this.lastname=arr[1]
    46. }
    47. }
    48. }
    49. })
    50. script>
    51. html>

     

    计算属性简写

    只考虑读取不考虑修改

    1. computed:{
    2. fullName(){
    3. console.log('get被调用了');
    4. return this.firstname+'-'+this.lastname
    5. }
    6. }

  • 相关阅读:
    Spring创建复杂对象
    大数据之hadoop伪分布集群搭建简要概述
    根视图切换动画
    UNIAPP微信小程序中使用Base64编解码原理分析和算法实现
    RPC协议
    智能手机收入和出货量双双下滑,造车成本不断增长,小米集团仍面临风险
    MySQL数据库二:MySQL索引
    MySQL对日期计算
    sql order by 排序 null值放最后,怎么写
    【JavaWeb】文件的上传和下载
  • 原文地址:https://blog.csdn.net/m0_62520946/article/details/126263010