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
}
监听
watch:{
text(new,old){
console.log(`${new}:${old}`)
}
}
或
const unWatch = this.$watch('text',(new,old){
console.log(`${new}:${old}`)
})
setTimeout(()=>{
unWatch()
},2000)
//需要手动销毁的第二种
<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: '123',
styles: {
color: 'red',
appearance: 'none'
},
styles2: {
color: 'black'
},
a: false,
b:[], // 可以拿到checkbox 的 value
c:'' // 性别
};
}
}
script>
<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 的解决方案
"message">
computed: {
message: {
get () {
return this.$store.state.obj.message
},
set (value) {
this.$store.commit('updateMessage', value)
}
}
}
如果在方法或者生命周期中使用了计算属性,则必须设置一个set
"demo">{{ fullName }}
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
}
}
})
升级
"demo">{{ obj.a }}
"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.component('myComponent',{
templace:'hello component',
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
}
//定义一个button组件
//button.vue
'button'>按钮
//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);
<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 包含组件选项的对象,其中data 选项必须是函数。
import Vue from 'vue'
// 一个包含组件选项的对象
const component = {
props:{
active:Boolean,
propOne:string
},
template:`"text" v-model="text">
"active">see me if active`,
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');
}
})