从0学习Vue3(7)

103 阅读1分钟

这篇文章来稍微查漏补缺,以下标序号是根据我之前的文章内容标滴,补充。

2.7 其他指令

之前学习的一些指令,在这里拓展学习一下:

事件监听指令v-on: 缩写@,参数$event,修饰符号如下:

  • .stop 阻止事件冒泡
  • .self 当事件在该元素本身触发时才触发事件
  • .capture 添加事件监听器,使用事件捕获模式
  • .prevent 阻止默认事件
  • .once 事件只触发一次

条件分支指令v-if/v-show: 下面来举例子

 <template>
   <h1 v-if="isTrue">如果是true则会展示</h1>
   <h1 v-show="isTrue">如果是true则会展示</h1>
   <button @click="isTrue=!isTrue">改变isTrue</button>
 </template>
 ​
 <script>
 ​
 ​
 export default {
   data(){
     return{
       isTrue:true
     }
   }
 }
 </script>

我们会发现,用法一样,当isTrue为false它们一样是消失,诶那到底有什么不同呢?点开控制台我们就知道了,看一下元素。会发现当isTrue为false的时候,v-if控制的元素是真的消失了,而v-show控制的元素还在页面,只不过加了一个display:none

那么既然有v-if 当然也是有v-elsev-else-if的:

 <!-- v-else 演示 -->
 <template>
   <h1 v-if="isTrue">此时isTrue为true</h1>
   <h1 v-else>此时isTrue为false</h1>   <!-- 我们要注意v-else后面是不需要加任何东西的 -->
   <button @click="isTrue=!isTrue">改变isTrue</button>
 </template>
 <!-- v-else-if 演示 -->
 <template>
   <h1 v-if="num===1">num=1</h1>
   <h1 v-else-if="num===2">num=2</h1>
   <h1 v-else>num=3</h1>
   <button @click="add">让num+1</button>
 </template>
 ​
 <script>
 export default {
   data(){
     return{
       num:1
     }
   },
   methods:{
     add(){
       this.num===3?this.num=1:this.num++
     }
   }
 }
 </script>

以上都很好理解嗷。

循环遍历指令v-for:

  • 遍历数组v-for="(item,[index]) in 数组"
  • 遍历对象 v-for="(value,[key],[index]) in 对象"

vue中列表循环需要加 :key="唯一标识",唯一标识可以是item里面的id、index等等,因为vue组件高度复用 增加Key可以标识组件的唯一性, 为了更好的区别各个组件。key的作用主要是为了高效的更新虚拟DOM,使用diff算法的处理方法,对操作前后的dom树同一层的节点进行对比,一层一层对比。

那我之前写的v-for都没有写key,是不好的习惯,最好都要写上:

 <template>
   <h4>恭喜小智夺冠QAQ</h4>
   <ul>
     <li v-for="item,index in list" :key="index">{{item}}</li>
   </ul>
 </template>
 ​
 <script>
 export default {
   data(){
     return{
       list:['皮卡丘','卢卡利欧','快龙','葱油兵','耿鬼','腮鱼龙']
     }
   }
 }
 </script>

3.13 组件化开发三要素(prop,自定义,slot)

父子组件之间的通信: 父子组件之间不能相互访问data内容

如果数据从(Patent)父组件传到(Child)子组件就得通过props(属性的意思) 。如果数据从子组件传给父组件就得通过 $emit Events(事件)

3.13.1 父传子props

首先我们创建一个子组件,我这里叫Child.vue,然后把它引入到App.vue中

 <template>
   <div>
     <childCom></childCom>
   </div>
 </template>
 ​
 <script>
 //引入子组件
 import childCom from './components/childCom.vue'
 export default {
   name:'App',
   data(){
     return{
       toChild:'传给子组件的数据'
     }
   },
   components:{
     childCom
   }
 }
 </script>

那么看到里面我要把数据传给子组件展示的话,需要通过props来传递,首先在子组件中接收:

 <template>
   <h1>{{msg}}</h1>
 </template>
 ​
 <script>
 export default {
   props:['msg']  //接收数据
 }
 </script>

其次在父组件中传递:

 <template>
   <div>
     <!-- msg对应子组件写的msg -->
     <childCom msg="hello"></childCom> 
   </div>
 </template>

这样子在页面上就会看到hello了,那么这样是传字符串,怎么传变量呢?像我上面已经在App.vue中写了一个变量toChild,传变量的话应该这么传:

 <template>
   <div>
     <!-- 必须在前面用 : 绑定数据,否则就只能传字符串 -->
     <childCom :msg="toChild"></childCom>
   </div>
 </template>

这样就可以把toChild传过去了!但是如果我们传去子组件的是一个数组,那么子组件应该这么接收:

 <script>
 export default {
   props:['msg'] 
 }
 </script>
 <!-- 以上是原本的写法,看清楚用的是 [] -->
 ​
 <script>
 export default {
   props:{  //这里变成了 {}
       list:{
           type:Array //告诉它是数组类型
       },
       msg:{
           type:String,                  //写上我们接收的类型
           default:'父组件不传值展示这个', //还能设置缺省值(也就是默认值)
           required:true                 //设置为true,如果父组件不传值,则会提示
       },
   }
 }
 </script>

3.13.2 子传父$emit

通常来说是在有事件发生的时候才会把数据传给父组件。比如有多个子组件,我们选择其中一个它会传一个id给父组件让父组1件用这个id去服务器取数据到页面渲染。那我们写个简单的例子,通过子组件按钮使父组件的数字加2:

实际上是 子组件告诉父组件要调用父组件的哪个函数,并可以传参

 <!-- App.vue 父组件 -->
 <template>
   <div>
     <h4>通过子组件传过来的消息改变num:{{num}}</h4>
     <!-- 下面绑定事件名,是在子组件中$emit定义的,而真正执行的是下面methods内的函数 -->
     <childCom @getNumToAdd="add"></childCom>
   </div>
 </template>
 ​
 <script>
 import childCom from './components/childCom.vue'
 export default {
   name:'App',
   data(){
     return{
       num:0
     }
   },
   components:{
     childCom
   },
   methods:{
     add(addNum){ //这里的addNum会接收到子组件传过来的参数
       this.num += addNum
     }
   }
 }
 </script>
 <!-- childCom.vue 子组件 -->
 <template>
   <button @click="myNum(2)">子组件</button>
 </template>
 ​
 <script>
 export default {
   methods:{
     myNum(num){
       this.$emit('getNumToAdd',num) //这里定义的是在父组件那边要绑定的函数名,可传参
     }
   }
 }
 </script>

两部分代码来回看 就能看懂了。总之我自己感觉是有点点绕哈哈哈。