Vue学习之路(2)-数据定义选项

6 篇文章 0 订阅
5 篇文章 0 订阅

引言

测试基于vue初始化的脚手架,不加router等其他的,使用index.html,编辑的入口main.js,结合控制台和页面观察输出结果,学习选项的使用

data选项:Vue 实例的数据对象(对象的成员变量)
类型:Object | Function

var vm = new Vue({
    data: function () {
      return {
        'a': 'a',
        'b': 'b'
      }
    }
})

//实例创建之后,可以通过 vm.$data 访问原始数据对象。Vue 实例也代理了 data 对象上所有的属性,因此访问 vm.a 等价于访问 vm.$data.a。

//以 _ 或 $ 开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性、API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些属性。

//建议通过function声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。
//如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!
//通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象.
//外部定义的去全局对象,对象在生命周期中参数都是双重绑定的,有变化会全局变化的(如果有共享对象需求可以选择)
//注意,不应该对 data 属性使用箭头函数 (例如data: () => { return { a: this.myProp }})。
//理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.myProp 将是 undefined。

//js中访问:
console.log(vm.$data.a)
console.log(vm.$data.b)
vm.$data.a = 'hello'
console.log(vm.$data.a)
console.log(vm.a)
console.log(vm.b)


//template语法访问:
{{ a }}
{{ b }}


props和propsData选项:(类似构造方法中,对外部的参数定义,成员变量的一部分)
// props 用于作为组件的参数声明
// 可以是数组或对象,起到组件间的通信作用
// 用于接收来自外部父组件的数据。
// 对象允许配置高级选项,如类型检测、自定义校验和设置默认值。

类型:Array<string> | Object



// 简单语法
Vue.component('props-demo-simple', {
  props: ['size', 'myMessage']
})

// 对象语法,提供校验
Vue.component('props-demo-advanced', {
  props: {
    // 检测类型
    height: Number,
    // 检测类型 + 其他验证
    age: {
      type: Number,
      default: 0,
      required: true,
      validator: function (value) {
        return value >= 0
      }
    }
  }
})


//创建一类组件,在内部使用子类组件


//vue文件对外导出时通过vue-loader转成一个组件对象
//<template></template> 定义组件的template选项,export default {}定义其他组件的配置选项

PropAndPropData.vue
<template>
  <div id="example">
    <h1>{{msg}}</h1>
    <h2>{{ message }}</h2>
    <the-child :message="message"></the-child>
  </div>
</template>
//传递常量
//message="message"
//从父组件中获取数据往子组件传递数据写法,并且支持父组件数据变换能监控到
//不推荐加法等计算表达式的做法在参数传递中使用,比如:message="message+1"数字和字符串相加会报错
//计算过程应通过computed计算属性,。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。以便于调试开发,避免类型报错(String和Number)
//:message="message"

<script>
  export default {
    name: 'PropAndPropData',
    data () {
      return {
        msg: 'PropAndPropData',
        message: 'parent'
      }
    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>


import Vue from 'vue'
import PropAndPropData from  './components/PropAndPropData'

Vue.config.productionTip = false

// 全局声明注册子组件,引进来放进所有对象的components中放进
// 第一个参数是注册的组件名称,第二个是组件定义数据
Vue.component('the-child', {
  // 声明 props
  props: ['message'],
  // 同样也可以在 vm 实例中通过 this.message 来使用
  template: '<div>{{ message }}-child</div>'
})

// template: '<prop-and-prop-data/>' 一个作用


//创建Vue实例,并在内部使用组件,组件的.vue文件定义的,import进来的对象
var vm  = new Vue({
  el: '#app',
  components: { PropAndPropData },
  template: '<PropAndPropData/>'
})

Vue.component('the-child', {
  // 声明 props
  props: ['message'],
  // 同样也可以在 vm 实例中通过 this.message 来使用
  template: '<div>{{ message }}-child:{{childmsg}}</div>',
  computed: {
    childmsg: function () {
      return this.message +'\'s child'
      }
    }
  }
)
// 通过computed进行属性计算
// Vue.component('the-child', {
//   // 声明 props
//   props: ['message'],
//   // 同样也可以在 vm 实例中通过 this.message 来使用
//   template: '<div>{{ message }}-child:{{childmsg}}</div>',
//   computed: {
//     childmsg: function () {
//       return this.message +'\'s child'
//       }
//     }
//   }
// )


//PropData 属性多用于测试创建出来的组件数据传递是否成功
类型:{ [key: string]: any }


//声明一个组件
var Comp = Vue.extend({
  props: ['msg'],
  template: '<div>{{ msg }}</div>'
})
//可以全局注册也可以不全局注册
//Vue.component('comp',Comp);

//测试组件实例化,并传递参数
var testchild = new Comp({
  propsData: {
    msg: 'hello'
  }
})
console.log(testchild.msg);
computed选项:计算属性
类型:{ [key: string]: Function | { get: Function, set: Function } }


//计算属性将被混入到 Vue 实例中。
//所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。

//注意,不应该使用箭头函数来定义计算属性函数 (例如 aDouble: () => this.a * 2)。
//理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。

//计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。
//注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的。
var vm = new Vue({
  el: '#app',
  data: { a: 1 },
  template: `
    <div class="example">
      <div  v-on:click="plus">点我呀</div >
      <div>{{aDouble}}</div>
      <div>{{aPlus}}</div>
    </div>
  `,
  methods: {
    plus: function () {
      this.a++
    }
  },
  computed: {
    // 仅读取
    aDouble: function () {
      return this.a * 2
    },
    // 读取和设置
    aPlus: {
      get: function () {
        return this.a + 1
      },
      set: function (v) {
        this.a = v - 1
      }
    }
  }
})

console.log(vm.a)
console.log(vm.aPlus)
vm.aPlus = 4;

console.log(vm.a)
console.log(vm.aPlus)
methods选项:事件处理器
类型:{ [key: string]: Function }


// methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。
//方法中的 this 自动绑定为 Vue 实例。

//注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。
//理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。

import Vue from 'vue'

Vue.config.productionTip = false

Vue.component('button-counter', {
  template: '<button v-on:click="incrementCounter">{{ counter }}</button>',
  data: function () {
    return {
      counter: 0
    }
  },
  methods: {
    incrementCounter: function () {
      this.counter += 1
      //触发当前实例上的事件(支持自定义的)。附加参数都会传给监听器回调。
      this.$emit('increment')
    }
  },
})


new Vue({
  el: '#app',
  template: `
  <div class="app"><p>{{ total }}</p>
  <button-counter v-on:increment="incrementTotal"></button-counter>
  <button-counter v-on:increment="incrementTotal"></button-counter></div>
  `,
  data: {
    total: 0
  },
  methods: {
    incrementTotal: function () {
      this.total += 1
    }
  }
})
watch选项:监听器
类型:{ [key: string]: string | Function | Object | Array }

//一个对象,键是需要观察的表达式,值是对应回调函数。
//值也可以是方法名,或者包含选项的对象。
//Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'

Vue.config.productionTip = false

var vm = new Vue({
  data: {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: {
      f: {
        g: 5
      }
    }
  },
  methods: {
    someMethod:function (val, oldVal) {
      console.log('b new: %s, old: %s', val, oldVal)
    }
  },
  watch: {
    a: function (val, oldVal) {
      console.log('a new: %s, old: %s', val, oldVal)
    },
    // 方法名
    b: 'someMethod',
    // 深度 watcher
    c: {
      handler: function (val, oldVal) {
        console.log('c new: %s, old: %s', val, oldVal)
      },
      deep: true
    },
    // 该回调将会在侦听开始之后被立即调用
    d: {
      handler: function (val, oldVal) {
        console.log('d new: %s, old: %s', val, oldVal)
      },
      immediate: true
    },
    e: [
      function handle1 (val, oldVal) {
        console.log('e handle1 new: %s, old: %s', val, oldVal)
      },
      function handle2 (val, oldVal) {
        console.log('e handle2 new: %s, old: %s', val, oldVal)
      }
    ],
    // watch vm.e.f's value: {g: 5}
    'e.f': function (val, oldVal) {
      console.log('e.f.g new: %s, old: %s', val.g, oldVal.g)
    }
  }
})
vm.a = 2
vm.b = 3
vm.c = 4
vm.d = 5
vm.e.f= {g:8}
vm.c = 9
vm.a = 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值