vue day01入门

概述:

VUE是一个MVVM的前端js库渐进式(需要什么用什么)的JavaScript框架,他封装了一些内容(基础指令及相关组件)供我们使用,里面用到的思维主要是数据驱动视图的思维(MVVM的核心)

 

 

view主要对应的是dom操作

viewmodel 主要里面内置对应的虚拟dom (通过编译将对应的实体dom抽取为虚拟dom对象 ----- 监听数据的改变 --- 影响对应的虚拟dom ---- 通过虚拟dom比对(diff算法) ---- 完成对应的实体dom渲染)

model主要是是数据存储对象

**通过数据来驱动视图的改变**

 

插值表达式 {{}}

  • 里面填写的变量为data里面的变量

  • 支持对应的js语法

  • 支持运算符及表达式

  • 支持对应的基础数据类型

vue的相关指令(语法和插值表达式一致)

vue的相关支持使用v-开头

v-html(innerHTML) 及 v-text (innerText)v-text相当直接写插值表达式

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
   <!-- 相关的vue的指令是加对应的标签的 指令也支持插值表达式语法 -->
   <p v-html="htmlCode+'<a>去百度</a>'"></p>
   <!-- v-html相当于innerHTML 解析对应的html内容 而v-text相当于innerText 不会解析对应的html代码 -->
   <p v-text="htmlCode"></p>
  {{htmlCode}}
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",//需要挂载的对应的虚拟dom
     data: { //数据
       code:'你好 世界',
       htmlCode:'<b>你好 世界</b>'
    }
  })
 </script>
</body>
</html>

v-if 及 v-show

根据对应的内容条件判断是否显示对应的标签

区别

v-if 判断当前的内容是否应该进行渲染 如果为true就渲染 为false就不渲染

v-show 不管怎么样都渲染 如果为false设置display为none

使用场景

切换较多使用v-show 切换只有一次使用v-if (v-if会重新渲染 v-show只渲染一次)


<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
   <!-- v-if判断当前的内容是否进行渲染 为true渲染 为false不渲染 -->
   <p v-if="isShow">我是if为true的内容</p>
   <p v-else-if="!isShow">我是elseif的条件</p>
   <p v-else>我是else的条件</p>
   <!-- v-show 控制当前元素是否显示 如果隐藏对应的是控制display为none -->
   <p v-show="isShow">我是v-show的内容</p>
   <!-- v-show和v-if的区别及使用场景
       v-if 根据对应的值来判断是否渲染 为true渲染 为false 不渲染
       v-show 不管条件为什么都进行渲染 为false就不显示 为true就显示
       使用场景
       切换比较多使用v-show(只渲染一次)
       切换如果只是一次 使用v-if(有可能不渲染 v-if会重新渲染)
   -->
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",
     data: {
       isShow:false
    }
  })
 </script>
</body>

</html>

属性绑定的相关 v-bind

v-bind的写法

v-bind:属性名="data中的变量"
v-bind的简写 :属性名

:属性名='属性值'
通过属性绑定改变样式的俩种方式
  • 通过class属性的绑定

  • 通过style属性绑定


<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
   .red{
       background-color: red;
  }
   .green{
       background-color: green;
  }
 </style>
</head>

<body>
 <div id="app">
   <!-- v-bind:属性名='data中的属性值' -->
   <p v-bind:class="className" v-bind:id="is?'box':'content'">我是一段文字</p>
   <!-- 简写 :属性名=属性值 -->
   <p :class="className">111</p>
   <!-- 给对应的标签添加样式的方法 -->
   <!-- 通过绑定class添加样式 -->
   <p :class="green">222</p>
   <!-- 通过绑定style属性添加样式 -->
   <p :style="`color:${color}`">3333</p>
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",
     data: {
       className:'red',
       green:'green',
       is:false,
       color:'#000'
    }
  })
 </script>
</body>

</html>

事件绑定 使用v-on

基础写法

v-on:事件名.事件修饰符 = 'methods里面的处理函数'
事件修饰符
  • stop 停止事件冒泡

  • prevent 阻止默认行为

  • self 停止向下传递

  • capture 捕获

  • once 只触发一次

  • passive 修饰符一般用于触摸事件的监听器,可以用来改善移动端设备的滚屏性能

事件修饰符注意事项

事件修饰符可以链式调用

事件绑定的简写

@事件名.事件修饰符 = 'methods里面的处理函数'

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
   <button v-on:click="handlerClick">点击触发</button>
   <!-- 简写方式 @事件名.事件修饰符 = methods里面的处理函数 -->
   <div @click="handlerClick"><p>你好</p></div>
   <!-- 事件修饰符 事件冒泡 stopPropagation 默认行为 preventDefault -->
   <a href="http://www.baidu.com"  @click.prevent="handlerClickFn">111</a>
   <div @click="handlerClick">    
       <a href="http://www.baidu.com" @click.prevent.stop.once="handlerClickFn">你好</a>
   </div>

 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",
     data: {
       msg:'你好 我是信息'
    },
     methods: {
       handlerClick(){ //不建议写箭头函数
           console.log('点击了')
           console.log(this);//如果是箭头函数 this指向window 不是箭头函数this指向当前的vue对象
           //this指向当前的vue实例 如果需要方法里面的option的属性值 使用this.$属性名
           console.log(this.$data.msg);
           //因为主要访问的是data 所以我们如果直接写对应的this.data中的属性名是可以直接访问数据的
           console.log(this.msg);
           console.log(this.$el);
      },
       handlerClickFn(){
           console.log('你好');
      }
    },
  })
 </script>
</body>

</html>
  • 对应的事件处理函数不能是箭头函数(this会指向window)

  • 对应的事件触发的this指向当前的vue实例

  • 当前的this要访问对应的属性 使用this.属性名来访问(el)

  • 当前需要在vue实例中访问对应的data中的数据 使用this.属性名

v-for 循环渲染

简单使用

v-for="(item,key) in data数据" :key='key'

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
   <!-- 数组遍历渲染 -->
   <ul>
       <!-- 哪个元素需要多个就给哪个元素添加v-for
           下标和值 类似于forEach 值 下标 第一个表示的值 第二个表示值
           (v,i) in list
           //遍历数组的时候 对应的i是下标 对应的v是值
           v-for 必须要进行 key值绑定 (diff算法比对的先比对key 提高对应的比对效率)
           key值不能是下标 下标能改(key值在一定的范围是唯一的)
       -->
       <li v-for="v in list" :key="v.id">
          {{v.username}}
       </li>
   </ul>
   <!-- v-for可以嵌套 -->
   <div v-for="(v,i) in list" :key="v.id">
      i就是下标{{i}}
      v表示就是对应的值 {{v.username}}
       <p v-for="item in v">
          {{item}}
       </p>
   </div>
   <!-- 遍历对象
       v表示值 i表示键
   -->
   <p v-for="(v,i) in user" :key="i">
      key:{{i}}
      value:{{v}}
   </p>
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",
     data: {
       list:[{
           id:1,
           username:'jack'
      },{
           id:2,
           username:'tom'
      },{
           id:3,
           username:'rose'
      },{
           id:4,
           username:'lidan'
      }],
       user:{
           username:'jack',
           age:18,
           sex:'男'
      }
    }
  })
 </script>
</body>

</html>
v-for 为什么要绑定key
  • 因为diff算法优先比较的是key值 所以设置key可以提高效率

v-for和v-if一起使用 先执行什么?(v-for和v-if谁的优先级高)
  • v-if优先级高于v-for(vue3中) v-for优先级高于v-if(vue2)效率损耗

  • v-for 和 v-if 不会一起使用

v-pre(跳过编译)

v-cloak(等待编译结束才显示)

v-once (只编译一次)


<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
   <!-- 跳过编译 v-pre -->
   <p v-pre>
      {{msg}}
   </p>
   <!-- 等待当前编译结束才显示 优化 -->
   <div v-cloak>
      {{msg}}
   </div>
   <!-- 当前的里面的内容只编译一次 -->
   <div v-once>
      {{msg}}
   </div>
   <button @click="handlerClick">改变msg的值</button>
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>
 <script>
   new Vue({
     el: "#app",
     data: {
       msg:'hello'
    },
     methods: {
       handlerClick(){
           this.msg = '你好世界'
      }
    },
  })
 </script>
</body>

</html>

v-model

双向数据绑定(实现原理 Object.defineProperty + obServer)

v-model针对表单标签进行双向数据绑定 主要绑定的是value值

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>

<body>
 <div id="app">
       <!-- v-model绑定的都是value -->
       <form action="">
           <input type="text" v-model="inputText">
           <p v-text="inputText"></p>
          你喜欢的水果有:
           <input type="checkbox" v-for="item in list" ::key="item" :value="item" name="foods" v-model="likes">
           <p v-text="likes"></p>
          你的性别是:
           <input type="radio" value="男" name="sex" v-model="sex">
           <input type="radio" value="女" name="sex" v-model="sex">
           <p v-text="sex"></p>
          文本域
           <textarea name="" id="" cols="30" rows="10" v-model="textareaText"></textarea>
           <p v-text="textareaText"></p>
           <input type="range" v-model="range">
           <p v-text="range"></p>
           <select v-model="optionValue">
               <option value="李丹">李丹</option>
               <option value="乔丹">乔丹</option>
               <option value="林丹">林丹</option>
               <option value="甄子丹">甄子丹</option>
           </select>
           <p v-text="optionValue"></p>
       </form>
 </div>
 <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script>

 <script>
   new Vue({
     el: "#app",
     data: {
       list:[
           '苹果','香蕉','梨','西瓜'
      ],
       likes:[],//绑定是一个数组
       sex:'男',
       inputText:'',
       textareaText:'',
       optionValue:'',
       range:''
    }
  })
 </script>
</body>

</html>

 

posted @ 2022-11-21 19:55  学呆学Dai了就摆烂  阅读(81)  评论(0)    收藏  举报