Vue基础(事件,指令,方法)

  • el 与 data 的两种书写方式
    el
<!-- 第一种写法,直接通过el挂载组件 -->
<body>
    <div id="root" style="width: 20px;height:20px;background-color:aliceblue">{{name}}</div>
</body>
<script>
    Vue.config.productionTip = false;
    new Vue({
        el: "#root",
        data: {
            name: "zs"
        }
    })
</script>
<!-- 第二种种写法,通过Vue提供的函数进行挂载 -->
const vue = new Vue({
     data: {
         name: "zs"
     }
 })
 vue.$mount("#root")

data

<!-- 第一种写法直接 -->
const vue = new Vue({
     data: {
         name: "zs"
     }
 })
<!-- 第一种写法直接 -->
data() {
    return {}
}

说明:el的第二种方式灵活性更强,可以实现元素与vue的动态挂载;data的第二种方式更常用,如果直接写对象式,数据是被vue实例共享的,一个实例数据发生变化就会影响所有其它实例,而函数式写法每次返回一个新的对象,每个实例都有自己的数据互相不影响。

  • vue事件处理
<body>
    <div id="root" style="width: 20px;height:20px;background-color:aliceblue">
        <!-- 第一种写法使用v-on -->
        <button v-on:click="show">点击事件</button>
          <!-- 第一种写法使用@代替v-on -->
        <button @click="show">点击事件</button>
    </div>
</body>
<script>
    Vue.config.productionTip = false;
    const vue = new Vue({
        el: "#root",
        data: {
            name: "zs",
            age: 18
        },
        methods: {
            show(e) {
                console.log(e)
            }
        },
    })
</script>

注意:如果我们的参数不传参数,那e就是当前这个事件
在这里插入图片描述
如果我们需要传参

  <button @click="show(1)">点击事件</button>

这个时候e的值就是1,如果我们希望事件这个参数别丢,需要进行占位

  <button @click="show($event, 1)">点击事件</button>
methods: {
    show(e, num) {
        console.log(e, num)
    }
}

这个时候e是事件,num是我们传递的参数。

  • 事件修饰符
@click.stop = "showInfo" // 阻止冒泡
@click.one = "showInfo" // 只触发一次
@click.capture = "show" // 捕获阶段执行
@click.self = "show" // 只有e.targe是自己的时候才触发
@click.passive // 事件默认行为立即执行
@click.native //某个组件的根元素上绑定事件
  • 键盘事件
    @keyup
    @keydown
    Vue给常用的键取了别名
    在这里插入图片描述
    使用方法@keyup.enter, 注意tab需要配合keydown使用
    在这里插入图片描述
    事件处理也可以结合使用@click.prevent.stop @click.ctl.y
  • 计算属性
<body>
  <!-- 计算属性
  vue中认为写在data中的是属性
  计算属性就是拿着已经有的属性计算出新的属性
  -->
  <div id="root">
      :<input value="张" v-model = "firstName"></input>
      :<input value="三" v-model = "lastNme"></input>
      姓名: <span>{{fullName}}</span>
  </div>
  <script type="text/javascript" src="js/vue .js"></script>
  <script>
      const vm = new  Vue({
          el : '#root',
          data : {
              firstName : "张",
              lastNme : "三"
          },
          computed: {
              fullName : {
                  // 有人读取fullname,get就会被调用
                  get() {
                      // 这里vue会做一个缓存
                      // 初次读取fullname时会被调用
                      // 所依赖的数据发生变化时也会重写调用
                      return this.firstName + "-" + this.lastNme
                  },
                  
                  set() {

                  }
              }
          }
      })
  </script>

简写如果确定只使用getter,也就是只需要读取值,不用修改这个值可以采用简写形式

computed: {
fullName() {
	return 
}
}

注意计算属性里面是不能有异步任务的,因为它需要依靠返回值。

  • 监视属性
    watch : {
    }
<script>
   const vm = new  Vue({
       el : '#root',
       data : {
           isHot : true
       },
       watch: {
           isHost : {
               // 一上来就执行一次回调,也就是初始化的时候执行一次
               immediate : true,
               // 当isHot发生变化的时调用
               handler(newValue, oldValue) {
                   console.log("修改了");
               }
           }
       }
   })
</script>

也可以这样写:

vm.$watch("isHot", {
   immediate : true,
   handler(newValue, oldValue) {
       console.log("isHost");
   }
})

监视多级属性

const vm = new  Vue({
     el : '#root',
     data : {
         isHot : true,
         numbers : {
             a : 1, 
             b : 2
         }
     },
     watch: {
         numbers : {
             deep : true, // 比如对象或数组里面的东西发生了变化也会被监听到,也就是说现在numbers里a,b发生变化这个handler事件也会触发
             handler(newValue, oldValue) {
                 console.log("修改了");
             }
         }
     }
 })

view可以监视多层结构,但是watch默认不可以检测多级结构。
简写(如果不需要深度监听,不需要一上来就执行,可以采用简写形式)

watch : {
isHot(newValue, oldValue) {
}
}
或者:
vm.$watch("isHot", function() {
}
})

在这里插入图片描述

  • vue绑定样式
    通过className, 动态绑定
    :class=“a”
    data{
    a : normal
    }
    之后修改直接:
    methods : {
    changeMood() {
    this.a = “basic”
    }
    }
    多个绑定(绑定类名)
    :class=“arr”
    data {
    arr : [“”,“”,“”,“”]
    }
    对象式写法,样式确定动态绑定
    :class=“obj”
    data : {
    obj : {
    style1:true,
    style2:false
    }
    }
    内联样式(需要驼峰写法)
    :style = “{fontSize : fsize + ‘px’;}”
    :style=“styleObj”
    data : {
    fontSize : ‘40px’
    }
    :style=“[styleObj1, styleObj2]” 可以写成数组,数组里面有样式对象(obj: {
    fontSize : ‘40px’
    })

  • 条件渲染
    隐藏元素
    v-show=“1==3” true则隐藏,但是节点还在(相当于display:none)
    v-show=“a” a可以再data中配置
    也可以隐藏元素
    v-if=“false” 条件渲染,但是它是将整个元素干掉,节点不在了
    v-else-if 就相当于else if的作用
    v-else 相当于else

<div  v-if="n === 1"></div>
<div  v-if="n === 2"></div>
<div  v-if="n === 3"></div>

如果需要使用v-if,v-else,v-else-if需要结构连贯,中间不能打断

<div  v-if="n === 1"></div>
<div  v-esle-if="n === 2"></div>
<div  v-else="n === 3"></div>

如果我们需要多个元素进行条件渲染且渲染条件相同,我们可以使用template包一层,需要注意的是它只能配合v-if用,也就是v-show是不能生效的

<template v-if="n === 1">
  <div>页面1</div>
  <div>页面2</div>
  <div>页面3</div>
</template>

注:如果我们切换的频率很低用v-if,如果切换频率很高用v-show因为这样不会频繁的创建DOM节点。

  • 列表渲染
<div id="root">
      <ul>
          <li v-for="p in persons" :key="p.id">
              {{p.name}} - {{p.id}}
          </li>
      </ul>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script>
      const vm = new  Vue({
          el : '#root',
          data : {
            persons : [
                {id : "001", name : "zs"},
                {id : "002", name : "ls"},
          ]
          }
      })
  </script>

特别注意,需要配置:key,相当于一个身份证标志一个元素:
:key=“p.id”

<div id="root">
     <ul>
         <li v-for="(p, index) in persons">
             {{p.name}} - {{p.id}}
         </li>
     </ul>
 </div>

也是可以这样写,这样index就是序号,p代表一个对象。
v-for也可以遍历一个列表

<ul>
    <li v-for="(value, key) in obj">
    </li>
</ul>
data : {
	obj : {
		name : "zs",
		age : 18
	}
}

也可以遍历字符串,和值范围。
特别注意key,如果用index千万不要再前面插入元素会破坏顺序,需要在末尾插入。

  • 列表过滤
watch : {
    keyWord : {
        // 一上来就执行
        immediate:true,
        handler(val) {
            this.backup = this.persons.filter(p => {
            return p.name.indexOf(val) !== -1
        })
        }
    },
}
})
  • vue set
    Vue.set(vm._data, ‘sex’ , ‘男’) 添加一个响应式的属性
    也可以用vm.$set
    Vue.set 只能在data里面的的对象添加响应式属性,不允许在vm和直接data上添加响应式属性。

  • Vue收集各种表单数据(技巧)
    收集表单数据:
    若:,则v-model收集的是value值,用户输入的就是value值。
    若:,则v-model收集的是value值,且要给标签配置value值。
    若:
    1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
    2.配置input的value属性:
    (1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
    (2)v-model的初始值是数组,那么收集的的就是value组成的数组
    备注:v-model的三个修饰符:
    lazy:失去焦点再收集数据
    number:输入字符串转为有效的数字
    trim:输入首尾空格过滤

  • Vue内置指令
    v-text 向所在节点中直接插入文本,不解析html标签

<body>
<!-- 
v-text指令:
1.作用:向其所在的节点中渲染文本内容。
2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
-->
<!-- 准备好一个容器-->
<div id="root">
	<div>你好,{{name}}</div>
	<div v-text="name"></div>
	<div v-text="str"></div>
</div>
</body>

<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

new Vue({
	el:'#root',
	data:{
		name:'尚硅谷',
		str:'<h3>你好啊!</h3>'
	}
})
</script>

v-html : 支持解析HTML元素。
v-html指令:
1.作用:向指定节点中渲染包含html结构的内容。
2.与插值语法的区别:
(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2).v-html可以识别html结构。
3.严重注意:v-html有安全性问题!!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
v-cloak
v-cloak指令(没有值):
1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题,给使用插值语法的元素加上v-cloak属性,设置样式,这样可以先让{{xxx}}影藏,等到加载完毕时显示出来。
v-once指令:
1.v-once所在节点在初次动态渲染后,就视为静态内容了。
2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

v-pre指令:
1.跳过其所在节点的编译过程。
2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

特别重要:
次文部分代码、文字、图片来源于尚硅谷视频教学(Vue)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值