在学习VUE入门视频时记录的知识点和代码,备忘。

基本

el:挂载点,id选择器#,不能挂载到<html> <body>两个标签

Vue指令

内容绑定、事件绑定

v-text设置标签内容,支持用插值表达式对原有变量进行相关操作。和两个花括号基本等价。

  1. <div id="vtext_app">
  2. <h2 v-text="message + '!'"></h2>
  3. <h2>局部更新{{ message + "!" }}</h2>
  4. <h2 v-text="info"></h2>
  5. </div>
  6. <script>
  7. var cur_app = new Vue({
  8. el:"#vtext_app",
  9. data:{
  10. message:"test",
  11. info: "多个变量支持"
  12. }
  13. })
  14. </script>

v-html设置innerhtml属性,如果要渲染html结构,需要使用该语句。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <p v-text="content1"></p>
  8. <p v-html="content1"></p>
  9. <p v-text="content2"></p>
  10. <p v-html="content2"></p>
  11. </div>
  12. <script>
  13. var app = new Vue({
  14. el:"#app",
  15. data:{
  16. content1:"hello",
  17. content2:"<a href='http://www.baidu.com'>百度</a>"
  18. }
  19. });
  20. </script>
  21. </body>
  22. </html>

v-on为元素绑定事件,点击、按键、鼠标滚动等,与@符号等价。时间对应的方法需要提前准备在methods当中。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <input type="button" value="v-on" v-on:click="doIt">
  8. <input type="button" value="v-on简写" @click="doIt">
  9. <input type="button" value="双击事件" @dblclick="doIt">
  10. <!-- 不操作dom,修改数据 -->
  11. <h2 @click="changeFood">{{ food }}</h2>
  12. </div>
  13. <script>
  14. var app = new Vue({
  15. el:"#app",
  16. data: {
  17. food:"番茄",
  18. },
  19. methods: {
  20. doIt: function(){
  21. alert("方法测试");
  22. },
  23. changeFood:function(){
  24. console.log(this.food);
  25. this.food += '好吃';
  26. }
  27. },
  28. });
  29. </script>
  30. </body>
  31. </html>

综合小实例,计数器。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <div class="input-num">
  8. <button @click="sub">-</button>
  9. <span>{{ num }}</span>
  10. <button @click="add">+</button>
  11. </div>
  12. </div>
  13. <script>
  14. var app = new Vue({
  15. el:"#app",
  16. data: {
  17. num: 0,
  18. },
  19. methods: {
  20. add:function(){
  21. if(this.num < 10){
  22. this.num++;
  23. }else{
  24. alert('已经达到最大值');
  25. }
  26. },
  27. sub:function(){
  28. if(this.num > 0){
  29. this.num--;
  30. }else{
  31. alert('已经到达最小值');
  32. }
  33. }
  34. },
  35. });
  36. </script>
  37. </body>
  38. </html>

显示切换、属性绑定

v-show根据表达式的真假,切换元素的显示隐藏状态。本质上是切换display属性。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <input type="button" value="切换显示状态" @click="changeIsShow">
  8. <img v-show="isShow" src="https://i0.hdslb.com/bfs/archive/e62b6b095ef38dfb742687f11e4b570dde420b5d.png" alt="">
  9. <img v-show="age>=18" src="https://i0.hdslb.com/bfs/archive/e62b6b095ef38dfb742687f11e4b570dde420b5d.png" alt="">
  10. </div>
  11. <script>
  12. var app = new Vue({
  13. el: "#app",
  14. data:{
  15. isShow: false,
  16. age: 18
  17. },
  18. methods: {
  19. changeIsShow:function(){
  20. this.isShow = !this.isShow;
  21. }
  22. },
  23. });
  24. </script>
  25. </body>
  26. </html>

v-if根据表达式的真假,切换元素的显示和隐藏,本质是操作dom元素的移除或添加,并非切换样式。表达式最终会解释为布尔值。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <input type="button" value="切换显示状态" @click="toggleIsShow">
  8. <p v-if="isShow">v-if测试</p>
  9. <p v-show="isShow">v-show测试</p>
  10. </div>
  11. <script>
  12. var app = new Vue({
  13. el: "#app",
  14. data: {
  15. isShow: false,
  16. },
  17. methods: {
  18. toggleIsShow: function () {
  19. this.isShow = !this.isShow;
  20. }
  21. },
  22. });
  23. </script>
  24. </body>
  25. </html>

v-bind设置元素的属性,src、class,使用方式为v-bind:属性=值,可以省略指令,直接用冒号拼接属性值。设置class可以通过三元表达式或者用对象的方式来设置,推荐用后者。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. <style>
  5. .active{
  6. border: 1px solid red;
  7. }
  8. </style>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <img v-bind:src="imgSrc" alt="">
  13. <br>
  14. <img :src="imgSrc" alt="" :title="imgTitle+'!!!'" :class="isActive?'active':''" @click="toggleActive">
  15. <br>
  16. <img :src="imgSrc" alt="" :title="imgTitle+'!!!'" :class="{active:isActive}" @click="toggleActive">
  17. </div>
  18. <script>
  19. var app = new Vue({
  20. el: "#app",
  21. data: {
  22. imgSrc:"https://i0.hdslb.com/bfs/archive/e62b6b095ef38dfb742687f11e4b570dde420b5d.png",
  23. imgTitle: "vbind测试",
  24. isActive: false,
  25. },
  26. methods: {
  27. toggleActive:function(){
  28. this.isActive = !this.isActive;
  29. }
  30. },
  31. });
  32. </script>
  33. </body>
  34. </html>

轮播图实例

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="mask">
  7. <div class="center">
  8. <!-- 左箭头 -->
  9. <!-- <a href="javascript:void(0)" @click="prev" class="left">
  10. <img src="" alt="">
  11. </a> -->
  12. <input type="button" value="←" v-show="index!=0" @click="prev">
  13. <!-- 图片 -->
  14. <img :src="imgArr[index]" alt="">
  15. <!-- 右箭头 -->
  16. <!-- <a href="javascript:void(0)" @click="next" class="right">
  17. <img src="" alt="">
  18. </a> -->
  19. <input type="button" value="→" v-show="index<imgArr.length-1" @click="next">
  20. </div>
  21. </div>
  22. <script>
  23. var app = new Vue({
  24. el:"#mask",
  25. data:{
  26. imgArr:[
  27. "https://i0.hdslb.com/bfs/archive/23f7ccf8b4cb143c6af7e6dc8534283bef293cb4.jpg@321w_182h_1c_100q.webp",
  28. "https://i0.hdslb.com/bfs/archive/6a85c04866e27c51929c289dcef3011cb5db1d5f.jpg@321w_182h_1c_100q.webp",
  29. "https://i2.hdslb.com/bfs/archive/90b09328d7daaa6fbff5002d25a311ada086f21b.jpg@321w_182h_1c_100q.webp"
  30. ],
  31. index:1
  32. },
  33. methods: {
  34. prev:function(){
  35. console.log(this.index);
  36. this.index--;
  37. },
  38. next:function(){
  39. this.index++;
  40. }
  41. },
  42. })
  43. </script>
  44. </body>
  45. </html>

列表循环、表单元素绑定

v-for根据数据生成列表结构,经常和数组结合使用,语法是(item, index) in 数据,数组内容的更新会同步到页面上。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <ul>
  8. <li v-for="(item,index) in arr">
  9. {{ index + 1}} 地点:{{ item }}
  10. </li>
  11. </ul>
  12. <input type="button" value="添加数据" @click="add">
  13. <input type="button" value="移除数据" @click="remove">
  14. <h2 v-for="item in vegetable" v-bind:title="item.name">
  15. {{ item.name }}
  16. </h2>
  17. </div>
  18. <script>
  19. var app = new Vue({
  20. el: "#app",
  21. data:{
  22. arr:["Beijing", "ShangHai", "GuangZhou"],
  23. vegetable:[
  24. {name:"西兰花炒蛋"},
  25. {name:"蛋炒西兰花"}
  26. ]
  27. },
  28. methods: {
  29. add:function(){
  30. this.vegetable.push({name:"🥦"})
  31. },
  32. remove:function(){
  33. this.vegetable.shift();
  34. }
  35. },
  36. });
  37. </script>
  38. </body>
  39. </html>

v-on补充内容,传递自定义参数、事件修饰符。

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <input type="button" value="点击" @click="doIt(666, '老铁')">
  8. <input type="text" @keyup.enter="sayHi">
  9. </div>
  10. <script>
  11. var app = new Vue({
  12. el: "#app",
  13. methods: {
  14. doIt:function(p1, p2){
  15. console.log('do it');
  16. console.log(p1);
  17. console.log(p2);
  18. },
  19. sayHi:function(){
  20. alert("吃了没?");
  21. }
  22. },
  23. });
  24. </script>
  25. </body>
  26. </html>

v-model获取和设置表单元素的值(双向数据绑定)

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <input type="text" v-model="message" @keyup.enter="getM">
  8. <h2>{{ message }}</h2>
  9. </div>
  10. <script>
  11. var app = new Vue({
  12. el: "#app",
  13. data:{
  14. message:"双向数据绑定 VUE全响应数据开发"
  15. },
  16. methods: {
  17. getM:function(){
  18. alert(this.message);
  19. }
  20. },
  21. });
  22. </script>
  23. </body>
  24. </html>

本地应用 记事本

没有写样式,只用了几个按钮:

  1. <html>
  2. <head>
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. </head>
  5. <body>
  6. <div id="app">
  7. <p>输入回车自动记录</p>
  8. <input type="text" v-model="message" @keyup.enter="addNote(message)">
  9. <input type="button" value="删除全部" @click="deleteAll" v-show="todos.length!=0">
  10. <br>
  11. <h3 v-text="'待办总数' + todos.length" v-if="todos.length != 0"></h3>
  12. <ul>
  13. <li v-for="(item, index) in todos">
  14. {{index}} {{ item }}
  15. <input type="button" value="×" @click="deleteOne(index)">
  16. </li>
  17. </ul>
  18. </div>
  19. <script>
  20. var app = new Vue({
  21. el: "#app",
  22. data: {
  23. message: "输入待办",
  24. todos:['写代码', '备考']
  25. },
  26. methods: {
  27. deleteAll:function(){
  28. // this.todos.splice(0);
  29. this.todos = [];
  30. },
  31. addNote:function(message){
  32. this.todos.push(message);
  33. },
  34. deleteOne:function(index){
  35. this.todos.splice(index, 1);
  36. }
  37. },
  38. });
  39. </script>
  40. </body>
  41. </html>

网络

axios引入<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

使用的api:https://github.com/AutumnFish/testApi

需要注意axios回调函数中的this已经改变,不能访问VUE实例中的数据。可以先把this保存起来,在回调函数中使用保存的this。

https://autumnfish.cn/歌曲相关api