vue的dom更新、事件绑定、数据读写都由vue实例对象vm负责。

options选项

options有哪些大类属性:

  1. 数据
  2. data/props/propsData/computed/methods/watch
  3. DOM
  4. el(挂载点)/template(html内容)/render(渲染)/renderError
  5. 生命周期钩子(钩子:是指切入点,就像火车的连接点一样)
  6. beforeCreate/created(创建元素)/beforeMount/mounted(挂载,就是将元素放入到页面)/beforeUpdate/updated/activated/deactivated/beforeDestroy/destroyed/errorCaptured
  7. 资源
  8. directives/filters/components
  9. 组合
  10. parent/mixins/extends/provide/inject
  11. 其他

插一条:方法是面向对象的,函数是数学的。obj.sayhi()叫方法,sayhi()叫函数。

el挂载点

el挂载点的语法:

  1. new Vue({
  2. el:'#app'
  3. })

也可以写成这样的形式

  1. new Vue({
  2. }).$mount('#app')

data内部数据

一种是对象形式,这种是有bug的

  1. data:{
  2. }

一种是函数形式,优先使用!

  1. data:function(){
  2. }
  3. //可以缩写为
  4. data(){
  5. }

如果data是在一个vue组件中,例如demo.vue,那么这个data必须是函数。为什么要使用函数形式而不是对象形式???
因为Demo是个对象,Vue会自动把它传给new Vue()。render中,相当于new Vue(Demo)。
用一次没问题,但如果用两次,像下面这样,等于传了两次Demo给new Vue()。
造成问题,两个组件,其中一个改了data数据,另一个也变了,因为引用的是同一个data。

  1. import Demo from './Demo.vue'
  2. new Vue({
  3. ...
  4. render:h=>h(X,[h(Demo),h(Demo)]) //new Vue(Demo),new Vue(Demo)
  5. })

如果写成函数形式,相当于每次都会调用Demo.data(),两次都是全新的对象,不存在共用data的问题了。
Vue官方文档也说明了,只接受function。

methods方法

methods可以代替filters,methods内用普通函数filter就可以了。

components组件

一种是文件组件,后缀是.vue。
用法1,import引入Demo组件。建议.vue的文件名写成全小写,因为有的古老操作系统分不清大小写
而import后面的组件名最好是大写,避免和原生标签重名。

  1. import Demo from './demo.vue'
  2. new Vue({
  3. components:{
  4. Frank:Demo
  5. }
  6. })
  7. //Demo又被命名为Frank感觉很奇怪
  8. //可以将Frank换成Demo
  9. new Vue({
  10. components:{
  11. Demo:Demo
  12. }
  13. })
  14. //于是可以缩写成
  15. new Vue({
  16. components:{
  17. Demo
  18. }
  19. })

用法2,直接在vue实例外用js方式创建,然后实例中直接引用:

  1. Vue.component('Demo2',{
  2. template:`
  3. <div></div>
  4. `
  5. })
  6. new Vue({
  7. template:`
  8. <div>
  9. <Demo2 />
  10. </div>
  11. `
  12. })

用法3,是用法1和用法2的结合

  1. new Vue({
  2. components:{
  3. Frank:{
  4. template:`
  5. <div></div>
  6. `
  7. }
  8. }
  9. })

到底什么叫组件???可以组合的物件。

四个钩子

created

这里面的内容是出现在内存中的

mounted

这里的内容出现在页面中

updated

这里是更新了,拿到了最新的

destroyed

从页面中消失了

props外部属性

prop是用来接收外部属性的

传字符串

接收方文件Demo.vue

  1. <template>
  2. {{message}}
  3. </template>
  4. <script>
  5. export default{
  6. props:['message']
  7. }
  8. </script>

实例中,给接收方传值:

  1. new Vue({
  2. template:`
  3. <Demo message="你好props" />
  4. `
  5. })

界面会显示:你好props

传js代码,在自定义的message前面加上:号

这时, n是js代码

  1. new Vue({
  2. template:`
  3. <Demo :message="n" />
  4. `
  5. })

如果想在js代码中加入字符串,就加引号,这里n就是字符串

  1. new Vue({
  2. template:`
  3. <Demo :message="'n'" />
  4. `
  5. })

所以可以传函数给子组件去调用
子文件中:

  1. <template>
  2. {{message}}
  3. <button @click="fn"></button>
  4. </template>
  5. <script>
  6. export default{
  7. props:['message','fn']
  8. }
  9. </script>

实例中:

  1. new Vue({
  2. data(){
  3. return:{
  4. n:0
  5. }
  6. },
  7. template:`
  8. <div>
  9. {{ n }}
  10. <Demo :message="n" :fn="add" />
  11. </div>
  12. `,
  13. methods:{
  14. add(){
  15. this.n += 1
  16. }
  17. }
  18. })

点击button,触发add(),会给vue实例中的n加1,也就是子组件对父级的属性进行了操作。