Vue 全家桶

vue实例上的属性

VueComponent{
    $attrs:(...)
    $children:[VueComponent] // 用来访问当前组件实例的直接子组件实例 【组件树】
    $createElement:f(a,b,c,d)
    $el:div#app //用来挂载当前组件实例的demo元素【dom访问】
    $els://用来访问$el元素中使用了v-el指令的DOM元素
    $listeners:(...)
    $options:{} //用来访问组件实例化时的初始化选项对象【数据访问】
    $parent:{} // 用来访问组件实例的父实例【组件树】
    $refs:{}  //用来访问ref指令的子组件【组件树】
    $root:{} // 用来访问当前组件树的根实例【组件树】
    $scopedSlots:{}
    $slots:{}
    $vnode:{}
    init
    msg
    sayHello
    title
    _c
    _data
    _directInactive:false
    _events:{}
    _hasHookEvent
    _inactive:null
    _isBeingDestroyed:false
    _isDestroyed:false
    _isMounted:true
    _isVue:true
    _props:{}
    _renderProxy:{}
    _renderRoot:{}
    _self:{}
    _staticTrees:null
    _uid:20
    _vnode
    _watcher
    _watchers
    $data //用来访问组件实例观察的数据对象【数据访问】
    $isServer
    $props
    $route
    $ssrContext
    get $attrs: f
    set $attrs: f
    get $listeners
    set $listeners
    get msg
    set msg
}

Dom 方法的使用

  • $appendTo(elementOrSelector,callback) 将el所指的DOM元素插入目标元素
  • $before(elementOrSelector,callback) 将el所指的DOM元素或片段插入目标元素之前
  • $after(elementOrSelector,callback) 将el所指的DOM元素或片段插入目标元素之后
  • $remove(callback) 将el所指的DOM元素或者片段从DOM中删除
  • $nextTick(callback) 用来在下一次DOM更新循环后执行指定的回调函数

event 方法的适用

  1. 监听

    • $on(event,callback) 监听实例的自定义事件
    • $once(event,callback) 同上,只触发一次。
    • $watch(property,callback(new,old))
          watch:{
              text(new,old){
                  console.log(`${new}:${old}`)
              }
          }
      
          或
      
          const unWatch = this.$watch('text',(new,old){
               console.log(`${new}:${old}`)
          })
          setTimeout(()=>{
              unWatch()
          },2000)
          //需要手动销毁的第二种
  2. 出发
    • $dispatch(event,args):派发事件,先在当前实例触发,在沿父链一层层向上,对应的监听函数返回false停止
    • broadcast(event,args):广 b r o a d c a s t ( e v e n t , a r g s ) : 广 播 事 件 , 遍 历 当 前 实 例 的 children,如果对应的监听函数返回fasle停止
    • $emit(event,args):触发事件
  3. 删除
    • $off(event,callback) 删除时间监听
  4. 其他
    • $forceUpdate() 强制组件刷新
    • $set(ele,attr,value) 给对象设置属性
    • $delete(ele,attr,value) 删除对象属性

生命周期

  • new Vue()
  • init Events & Lifecycle
  • beforeCreate
  • init injections & reactivity
  • created
  • Has ‘el’ option?
  • Has template option
  • compile template into reder function || compile el’s outerHTML as template*
  • beforeMount
  • crate vm.$el and replace “el” with it
  • mounted
  • beforeUpdate
  • Virtual DOM re-render and patch
  • updated
  • when vm.$destroy() is called
  • beforeDestroy
  • Teardown watchers , child components and event listeners
  • Destroyed
  • destroyed

数据绑定

<template>
  <div id="app">
    <p>{{isActive?'active':'notActive'}}</p>
    <p>{{arr.join(' ')}}</p>
    <p>{{Date.now()}}</p>
    <p v-html="html"></p> 
    <div
      :class="{ active: isActive }"
      :style="[styles, styles2]"
    ></div>
    <div :class="[isActive? 'active':'']"></div>
    <ul>
      <li v-for="(item,index) in arr" :key="index">{{item}}</li>
    </ul>

    // 单个checkbox
    <input type="checkbox" v-model="a"> {{a}} <br/>
    // 多个checkbox
    爱好:<input type="checkbox" v-model="b" value="游泳"> 游泳
    <input type="checkbox" v-model="b" value="游泳"> 爬山
    <input type="checkbox" v-model="b" value="游泳"> 睡觉

    性别:<input type="radio" v-model="c" value="男"><input type="radio" v-model="c" value="女"> 女

    // 只绑定一次
    <p v-once="a"></p> 

  </div>
</template>
<script>
export default {
  data() {
    return {
      isActive: false,
      arr: [1, 2, 3],
      html: '<span>123</span>',
      styles: {
        color: 'red',
        appearance: 'none'
      },
      styles2: {
        color: 'black'
      },
      a: false,
      b:[], // 可以拿到checkbox 的 value
      c:'' // 性别
    };
  }
}
</script>

v-model 修饰符

  1. .number

    <input v-model.number='age' type='number'>
  2. .trim 去掉空白符
  3. .lazy 值数据同步

computed 计算属性

<template>
  <div id="app">
    <p>{{name}}</p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      firstName: 'Fin',
      lastName: 'Get',
    };
  },
  computed: {
    name() {
      return `${this.firstName}${this.lastName}`
    }
  }
}
</script>

双向绑定的计算属性与vuex

// vuex state是无法直接修改的,官方给出了 v-model 的解决方案
<input v-model="message">

computed: {
  message: {
    get () {
      return this.$store.state.obj.message
    },
    set (value) {
      this.$store.commit('updateMessage', value)
    }
  }
}
如果在方法或者生命周期中使用了计算属性,则必须设置一个set

watch 监听器

<div id="demo">{{ fullName }}</div>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: { // watch 方法最初绑定的时候,它是不会执行的,只有变化了才会执行
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

升级

<div id="demo">{{ obj.a }}</div>
<input v-model="obj.a" />

var vm = new Vue({
  el: '#demo',
  data: {
    obj: {
      a: '123'
    }
  },
  watch: {
    obj: {
      handler() {
        console.log('obj.a changed');
      },
      immediate: true,
      deep: true // 如果不加这一句,在输入框中输入值,并不会打印 obj.a changed
    }
  }
})

组件

vue组件中的data 为什么必须是函数

Vue.component('myComponent',{
    templace:'<div>hello component</div>',
    data(){
        return {}//返回一个唯一的对象,不要和其他组件共用一个对象返回
    }
})

可以理解构造函数,对构造函数的引用,实例化一个组件对象。
差不多就是这样:

let MyComponent = function(){} //定义一个构造函数
MyComponent.prototype.data = {
    name:'component',
    age:0
}
// 实例化组件对象
let componentA = new MyComponent()
let componentB = new MyComponent()
componentA.data.name === componmentB.data.name //true

改一下
MyComponent.prototype.data = function(){
    return:'component'
    ,age:0
}

用Vue.use()定义全局组件

//定义一个button组件
//button.vue
<template>
    <div class='button'>按钮</div>
</template>

//button.js
import buttonComponent from './button.vue'
const Button = {
    install(Vue){
        Vue.component('Button',ButtonComponent)
    }
}
export default Button

//main.js
import Button from './component/button.js';
Vue.use(Button);

props

<template>
    <div class='button'>按钮</div>
</template>
<script>
export default{
    props:['msg'], //并无限制
    props:{
        propA:Number, //基础的类型检查
        propB:[String,Number],//多个可能的类型
        propC:{  //必填的字符串
            type:String,
            required:true
        },
        propD:{  //带有默认值的数字
            type:Number,
            default:100
        },
        propE:{  //带有默认值的对象
            type:Object,
            default:fuction(){
                return {mssage:'hello'}
            }
        },
        propF:{  //自定义验证函数
            validator(value){
                // 这个值必须匹配下列字符串中的一个

                return ['success', 'warning', 'danger'].indexOf(value) !== -1
            }
        }
    }
}
</script>

vue组件 extend

Vue.extend 包含组件选项的对象,其中data 选项必须是函数。

import Vue from 'vue'
// 一个包含组件选项的对象
const component = {
    props:{
        active:Boolean,
        propOne:string
    },
    template:`<div><input type="text" v-model="text">
      <span v-show="active">see me if active</span></div>`,
    data(){
        return{
            text:0
        }
    },
    mounted(){
        console.log('coml mounted')
    },
}
//创建一个 子类
const CompVue = Vue.extend(compoent)        
//实例化一个
new CompVue({
    el:'#root',
    propsData:{
        propOne:'xxx'
    },
    data:{
        text:123
    },
    mounted () {                    
       console.log('instance mounted');
    }
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值