vue传递数据的方式

77 阅读2分钟

provide inject不推荐使用
兄弟组件:通过共同祖辈组件
通过共同的祖辈组件搭桥,$parent或$root

// brother1
this.$parent.$on('foo', handle)
// brother2
this.$parent.$emit('foo')

eventbus的原理: Vue.prototype.$bus = new Vue();
类似于兄弟组件


vue中有2种数据绑定的方式:

  1. 单向绑定(v-bind):数据只能从data流向页面
    备注:
    v-bind,简写为::
    v-bind:href = "xxx" 等价于 :href = "xxx"
  2. 双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data
    备注:
    ①双向绑定一般都应用在表单类元素上(如:input、select等)
    ②v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值

data与el的2种写法:

  1. el有2种写法
    ①new Vue时候配置el属性
    ②先创建Vue实例,随后再通过vm.$mount('#root')指定el的值
// el的两种写法
const v = new Vue({
    // el: '#root',   // 第一种写法
    data: {
        name: 'tyy'
    }
})
v.$mount('#root')   // 第二种写法
  1. data有2种写法
    ①对象式
    ②函数式
    如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错
// data的两种写法
new Vue({
    el: '#root',
    // data的第一种写法:对象式
    /*
    data: {
        name: 'tyy'
    }
    */
    // data的第二种写法:函数式
    data: function(){
        return {
            name: 'tyy'
        }
    }
    // 函数式,或者简写为以下形式:
    /*
    data() {
        return {
            name: 'tyy'
        }
    }
    */
})
  1. 一个重要的原则
    由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了

MVVM模型

  1. M:模型(Model):对应data中的数据
  2. V:视图(View):模板
  3. VM:视图模型(ViewModel):Vue实例对象 MVVM.png MVVM代码理解.png 通俗理解:
    ① M是数据,V是DOM页面结构,VM是中间桥梁
    ② VM将M和V连接起来
    观察发现:
    ① data中所有的属性,最后都出现在了vm身上
    ② vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用

数据代理

// Object.defineProperty,给对象定义属性
let person = {
    name: 'tyy',
    gender: 'female'
}
Object.defineProperty(person, 'age', {
    value: 18
})
console.dir(person)

以上代码的结果为下图所示:

颜色浅.png 注意:age的颜色,相较于gender和name颜色较浅,因为age不可以遍历(也称为不可枚举)
因为Object.defineProperty的属性:enumerable,表示能否通过for in循环访问属性,默认值为false,默认为不可以遍历
这一点,和直接给对象添加属性(即:person.age === 18),是不同的,直接添加属性结果如下图所示:value颜色不是浅的

直接添加属性.png