• Vue3.0第一天


    安装vue调试插件

    为方便Vue调试,F12看对象和变量信息,请先安装Edge浏览器,和谷歌浏览器的调试插件

    打开Vue官网https://cn.vuejs.org/ 

    然后在顶层找到 生态系统->工具链指南->浏览器开发着插件

    在里面下载安装插件:Vue.js devtools 

    Edge可以直接安装插件,谷歌浏览器可以科学上网安装插件,安装完毕后打开是vue编写的页面就按F12然后找到 》然后点开Vue 就可以针对页面的Vue变量进行调试查看。(如果是vue编写的页面,Vue插件图标会亮,不是则不亮的)

    点开Vue后就会看到如下界面

    以下是代码

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. head>
    10. <body>
    11. <div>
    12. {{10+20}} 这一个运算不起作用,页面展示的就是一个{{10+20}}字符串,因为它不在Vue作用容器内
    13. div>
    14. <div id="box">
    15. {{10+20}}
    16. {{myname}}
    17. {{GetString()}}
    18. div>
    19. <script>
    20. //Vue.createApp方法创建一个vue实例,然后用mount方法将应用实例挂载在一个id为box的容器元素中。
    21. //那么id=box的容器就使用了vue模版引擎进行渲染
    22. //Vue.createApp().mount("#box")
    23. Vue.createApp({
    24. data() {
    25. return {
    26. myname: "凡凡"
    27. }
    28. },
    29. methods: {
    30. GetString() {
    31. return "abc";
    32. }
    33. }
    34. }).mount("#box")
    35. script>
    36. body>
    37. htmI>

    文本插值:

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. head>
    10. <body>
    11. <div id="app">
    12. <div>{{10+20}}div>
    13. <div>{{myname}}div>
    14. <div>{{myname.slice(0,1)}}div>
    15. <div>{{myname+"-欢迎您"}}div>
    16. <div>{{isLogin?"已登陆":"未登录"}}div>
    17. <script>
    18. var app = Vue.createApp({
    19. data() {
    20. return {
    21. myname: "凡凡",
    22. isLogin:true
    23. }
    24. }
    25. }).mount("#app")
    26. script>
    27. div>
    28. body>
    29. htmI>

    v-bind指令:用于绑定元素属性

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. <style>
    10. .yellow{
    11. background-color: yellow;
    12. }
    13. .red{
    14. background-color: red;
    15. }
    16. .hidden{
    17. display: none;
    18. }
    19. .show{
    20. display: block;
    21. }
    22. .aaa{
    23. background-color:aqua;
    24. }
    25. .bbb{
    26. font-size: 8px;
    27. }
    28. .ccc{
    29. color:blue;
    30. }
    31. style>
    32. head>
    33. <body>
    34. <div id="app">
    35. <div v-bind:class="color">{{myname}}div>
    36. <div v-bind:class="isLogin?'red':'yellow'">登录状态div>
    37. <div v-bind:class="isShow?'show':'hidden'">哈哈div>
    38. <div v-bind:class="{aaa:true,bbb:false,ccc:true}">中华人民共和国Adiv>
    39. <div v-bind:class="classObj">中华人民共和国Bdiv>
    40. <div v-bind:class="['aaa','ccc']">中华人民共和国Cdiv>
    41. <div v-bind:class="classArr">中华人民共和国Cdiv>
    42. <img v-bind:src="url" width="120" height="33"><br>
    43. <img v-bind="imgObj"><br>
    44. <div v-bind:style="{backgroundColor:'red'}">中华人民共和国Ddiv>
    45. <div v-bind:style="{backgroundColor: color}">中华人民共和国Ediv>
    46. <div v-bind:style="{backgroundColor:'red',fontSize:'20px'}">中华人民共和国Fdiv>
    47. <div v-bind:style="styleObj">中华人民共和国Mdiv>
    48. <div v-bind:style="[{backgroundColor:'red'},{fontSize:'20px'}]">中华人民共和国Kdiv>
    49. <div v-bind:style="styleArr" v-on:click="GetGroundImage">中华人民共和国Ldiv>
    50. <button disabled="disabled">clicibutton>
    51. <button disabled="true">clicibutton>
    52. <button disabled="false">clicibutton>
    53. <button v-bind:disabled="state">clicibutton>
    54. <script>
    55. var app = Vue.createApp({
    56. data() {
    57. return {
    58. myname: "凡凡",
    59. isLogin:true,
    60. isShow:false,
    61. color:"yellow",
    62. url:"http://sc0.hao123img.com/res/r/image/2017-09-27/297f5edb1e984613083a2d3cc0c5bb36.png",
    63. imgObj:{
    64. src:"http://sc0.hao123img.com/res/r/image/2017-09-27/297f5edb1e984613083a2d3cc0c5bb36.png",
    65. Width:120,
    66. Height:33
    67. },
    68. classObj:{
    69. aaa:true,
    70. bbb:false,
    71. ccc:true
    72. },
    73. styleObj:{
    74. backgroundColor:'red', //也可以写成这样:'background-color':'red',(注意带-的名称需要用''包裹起来)
    75. fontSize:'20px', //也可以写成这样:'font-size':'200px'
    76. //很多时候这个背景图片是通过Ajax方法从后台获取,然后动态给styleObj对象增加这个backgroundImage属性然后赋值的
    77. backgroundImage:"url(http://sc0.hao123img.com/res/r/image/2017-09-27/297f5edb1e984613083a2d3cc0c5bb36.png)" //也可以写成这样:'background-image':'200px'
    78. },
    79. classArr:["aaa","ccc","bbb"],
    80. styleArr:[{backgroundColor:'red'},{fontSize:'20px'}],
    81. state:false
    82. }
    83. },
    84. methods:{
    85. GetGroundImage(){
    86. this.styleArr.push({backgroundImage:"url(http://sc0.hao123img.com/res/r/image/2017-09-27/297f5edb1e984613083a2d3cc0c5bb36.png)"}) //动态的添加一个背景图片
    87. this,styleArr.push({fontSize:'50px'}) //因为styleArr里面本来就存在{fontSize:'20px'}这个对象了,此时我们push大片styleArr后,最新的值就会覆盖掉原来的值,所以原来的{fontSize:'20px'}就变成了{fontSize:'50px'}
    88. }
    89. }
    90. }).mount("#app")
    91. script>
    92. div>
    93. body>
    94. htmI>

    v-show指令:有更高的初始渲染开销,频繁切换用v-show较好

    v-if 指令:有更高的切换开销,如果比较少的切换,用v-if较好

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. <style>
    10. .hidden{
    11. display: none;
    12. }
    13. .show{
    14. display: block;
    15. }
    16. style>
    17. head>
    18. <body>
    19. <div id="app">
    20. <div v-bind:class="isShow?'show':'hidden'">哈哈div>
    21. <div v-show="isShow">显示或者隐藏div>
    22. <div v-if="isShow">显示或者隐藏div>
    23. <div v-show="dataList.length===0">暂无数据div>
    24. <div v-if="dataList.length===0">暂无数据div>
    25. <ul v-for="item in commodityList">
    26. <li>{{item.title}}
    27. <b v-if="item.state===0">未付款b>
    28. <b v-else-if="item.state===1">已付款b>
    29. <b v-else-if="item.state===2">已完成b>
    30. <b v-else>未知b>
    31. li>
    32. ul>
    33. <script>
    34. var app = Vue.createApp({
    35. data() {
    36. return {
    37. myname: "凡凡",
    38. isShow:false,
    39. dataList:["AA","BB","CC"],
    40. commodityList:[
    41. {title:'手机',state:0},
    42. {title:'衣服',state:1},
    43. {title:'鞋子',state:2},
    44. ]
    45. }
    46. }
    47. }).mount("#app")
    48. script>
    49. div>
    50. body>
    51. htmI>

    v-for指令:

    模糊查询小案列

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. <style>
    10. .liColor {
    11. background-color: brown;
    12. }
    13. style>
    14. head>
    15. <body>
    16. <div id="app">
    17. <ul>
    18. <li v-for="item in dataList">值:{{item}}--索引:{{index}}li>
    19. ul>
    20. <ul>
    21. <li v-for="item,index in dataList" v-bind:class="currentClickIndex===index?'liColor':''"
    22. v-on:click="ChangeColor(index)">值:{{item}}--索引:{{index}}li>
    23. ul>
    24. <ul>
    25. <li v-for="(item,index) in dataList" v-bind:class="currentClickIndex===index?'liColor':''"
    26. v-on:click="ChangeColor(index)">值:{{item}}--索引:{{index}}li>
    27. ul>
    28. <ul v-for="({title,state},index) in commodityList">
    29. {{title}}
    30. <li v-if="state===0">未付款li>
    31. <li v-else-if="state===1">已付款li>
    32. <li v-else-if="state===2">已完成li>
    33. <li v-else>未知li>
    34. ul>
    35. <ul>
    36. <li v-for="({title,state},index) in commodityList">{{title}}
    37. <div v-if="state===0">未付款div>
    38. <div v-else-if="state===1">已付款div>
    39. <div v-else-if="state===2">已完成div>
    40. <div v-else>未知li>
    41. ul>
    42. <ul>
    43. <li v-for="value in userObj">值是:{{value}}li>
    44. ul>
    45. <ul>
    46. <li v-for="(value,key) in userObj">键是:{{key}} --值是:{{value}}li>
    47. ul>
    48. <ul>
    49. <li v-for="(value,key,index) in userObj">键是:{{key}} --值是:{{value}}--索引是:{{index}}li>
    50. ul>
    51. <ul>
    52. <li v-for="value of userObj">值是:{{value}}li>
    53. ul>
    54. <ul>
    55. <li v-for="(value,key) of userObj">键是:{{key}} --值是:{{value}}li>
    56. ul>
    57. <ul>
    58. <li v-for="(value,key,index) of userObj">键是:{{key}} --值是:{{value}}--索引是:{{index}}li>
    59. ul>
    60. <ul>
    61. <li v-for="item in 5">值是:{{item}}li>
    62. ul>
    63. <input type="text" v-model="inputval"/>
    64. <ul>
    65. <template v-for="item in GetSelectItems()">
    66. <li>{{item}}li>
    67. template>
    68. ul>
    69. <script>
    70. var app = Vue.createApp({
    71. data() {
    72. return {
    73. dataList: ["AA", "BB", "CC"],
    74. currentClickIndex: -1, //当前点击li的索引标记,初始值为-1的因为页面刚刚渲染出来肯定是没有被点击的,所以不可能存在背景色位红色的li
    75. commodityList:[
    76. {title:'手机',state:0},
    77. {title:'衣服',state:1},
    78. {title:'鞋子',state:2},
    79. ],
    80. userObj:{
    81. name:'张三',
    82. age:23,
    83. email:'abc123@qq.com'
    84. },
    85. inputval:'',
    86. charArr:["aaa",'abc','abd','bca']
    87. }
    88. },
    89. methods: {
    90. ChangeColor(index) {
    91. this.currentClickIndex = index; //将当前点击的li的索引赋值给currentClickIndex
    92. },
    93. GetSelectItems(){
    94. //includes() 方法用于判断字符串是否包含指定的子字符串
    95. //filter方法是过滤方法, item表示当前遍历charArr数组的项,如果当前项包含了input中输入的值,则找出来,然后统一返回一个数组
    96. var selectIitemArr= this.charArr.filter(item=>item.includes(this.inputval))
    97. return selectIitemArr;
    98. }
    99. }
    100. }).mount("#app")
    101. script>
    102. div>
    103. body>
    104. htmI>

    template标签:html中的template标签中的内容在页面中不会显示

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. head>
    10. <body>
    11. <div id="app">
    12. <div v-if="isShow">
    13. <div>111div>
    14. <div>222div>
    15. <div>333div>
    16. div>
    17. <div>
    18. <div>111div>
    19. <div>222div>
    20. <div>333div>
    21. div>
    22. <template v-if="isShow">
    23. <div>111div>
    24. <div>222div>
    25. <div>333div>
    26. template>
    27. <div>111div>
    28. <div>222div>
    29. <div>333div>
    30. <ul>
    31. <template v-for="item in commodityList">
    32. <li v-if="item.state<2">{{item.title}}li>
    33. template>
    34. ul>
    35. <ul>
    36. <template v-for="({title,state},index) in commodityList">
    37. <li v-if="state<2">{{title}}li>
    38. template>
    39. ul>
    40. <script>
    41. var app = Vue.createApp({
    42. data() {
    43. return {
    44. isShow: true,
    45. commodityList:[
    46. {title:'手机',state:0},
    47. {title:'衣服',state:1},
    48. {title:'鞋子',state:2},
    49. ],
    50. }
    51. }
    52. }).mount("#app")
    53. script>
    54. div>
    55. body>
    56. htmI>

    v-on指令:

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. <style>
    10. .liColor {
    11. background-color: brown;
    12. }
    13. style>
    14. head>
    15. <body>
    16. <div id="app">
    17. {{count}}
    18. {{myname}}
    19. <button v-on:click="count++">增加1button>
    20. <button v-on:click="count--">减少1button>
    21. <button v-on:click="GetInfo()">clickbutton>
    22. <button v-on:click="GetInfo">clickbutton>
    23. <input v-on:input="GetEventA" id="5">clickAbutton>
    24. <input v-on:input="GetEventB()" id="6">clickBbutton>
    25. <input v-on:input="GetEventC(7)" id="7">clickCbutton>
    26. <input v-on:input="GetEventD(7,$event)" id="7">clickDbutton>
    27. <ul>
    28. <li v-for="item,index in dataList" v-bind:class="currentClickIndex===index?'liColor':''"
    29. v-on:click="ChangeColor(index)">值:{{item}}--索引:{{index}}li>
    30. ul>
    31. <script>
    32. var app = Vue.createApp({
    33. data() {
    34. return {
    35. count:0,
    36. myname: "凡凡",
    37. isShow: false,
    38. dataList: ["AA", "BB", "CC"],
    39. currentClickIndex: -1 //当前点击li的索引标记,初始值为-1的因为页面刚刚渲染出来肯定是没有被点击的,所以不可能存在背景色位红色的li
    40. }
    41. },
    42. methods: {
    43. GetInfo() {
    44. alert(1);
    45. console.log("这个this其实就是app对象", this)
    46. this.myname = "赵云" //点击button控件的时候就将myname赋值为赵云了
    47. },
    48. GetEventA(evt) {
    49. // alert(2);
    50. console.log(evt); //调用这个方法如果不传递参数,默认就自带了一个元素的原生事件evt,有了一个元素的原生事件对象我们就可以从这个对象中获取到我们需要元素数据了。
    51. console.log(evt.target.value); //在输入框内容发生变化后打印出:当前输入框中录入的值。
    52. console.log(evt.target.id); //在输入框内容发生变化后打印出:这个元素的id属性值
    53. this.myname = evt.target.value;
    54. },
    55. GetEventB(evt) {
    56. console.log(evt.target.id); //错误用法:因为调用方法是带括号的,但是在调用的时候没用传递参数,所以这里无法收到元素原生事件对象的,所以就无法获取到id值
    57. },
    58. GetEventC(id) {
    59. console.log(id); //方法传递了7的值,所以就可以打印出7
    60. },
    61. GetEventD(a,evt) {
    62. console.log(a);
    63. console.log(evt.target.id);
    64. },
    65. ChangeColor(index) {
    66. this.currentClickIndex = index; //将当前点击的li的索引赋值给currentClickIndex
    67. }
    68. }
    69. }).mount("#app")
    70. script>
    71. div>
    72. body>
    73. htmI>

    v-html指令:

    1. html>
    2. <htmI 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://unpkg.com/vue@3/dist/vue.global.js">script>
    9. head>
    10. <body>
    11. <div id="app">
    12. {{myContent}}
    13. <div v-html="myContent">div>
    14. <script>
    15. var app = Vue.createApp({
    16. data() {
    17. return {
    18. myContent: "这是我的内容"
    19. }
    20. },
    21. methods: {
    22. }
    23. }).mount("#app")
    24. script>
    25. div>
    26. body>
    27. htmI>

    v-model:双向绑定

    说明与原理

    1. 什么是v-model
      • v-model 本质上是一颗语法糖,可以用 v-model 指令在表单