vue中methods 和 computed 和 watch方法

2019-06-12  本文已影响0人  解勾股

methods 和 computed 和 watch方法的区别

computed是计算属性,是有依赖缓存的,只有在它的依赖发生改变时才会重新计算,这个计算出来的值,是可以直接当成data来用的,在用的时候不需要添加(),computed必须要有一个return值

methods没有依赖缓存,只要发生重新渲染,methods方法总会执行该函数

数据量大,需要缓存的时候用computed,每次确实需要重新-加载,不需要缓存 的时候使用methods

watch是Vue提供的一种更通用的方式来观察和响应Vue实例上的数据变动

尽量使用computed计算属性来监视数据的变化,因为他本身就有这个属性,watch没有computed自动,手动设置代码更复杂

组件

定义一个组建的配置项,一般规范是大驼峰去命名一个组件,实际上还是一个Vue实例

 const HelloWorld = {
            template: '<div>hello world</div>'
        }

全局注册一个组建 ,就可以在任何地方使用

第一个参数是要使用的标签名字,不管是使用中线还是大驼峰,在使用组建的时候,都要使用小写字母加中划线

第二个参数就是组建的配置项

Vue.component('HelloWorld', HelloWorld)
       

局部注册一个组件,只有当前Vue实例中才能使用这些组件. 注意这里是components

<div id="app">
  <h3>app</h3>
  <hello-world></hello-world>
</div>
<div id="app1">
  <h3>app1</h3>
  <!-- 这里就报错了,因为我把全局注册的组件关闭了 -->
  <hello-world></hello-world>
</div>

const app = new Vue({
  el: '#app',
  // 局部注册一个组件,只有当前Vue实例中才能使用这些组件. 注意这里是components
  components: {
    HelloWorld
  },
  data: {
    msg: 'hello'
  }
})
component-data

组件的data必须是一个方法return一个对象,因为这样才能保证每个组件的数据是独立的而不是共享的

 const HelloWorld = {
      template: '<div>{{msg}}</div>',
      data () {
        return {
          msg: 'hello world'
        }
      }
    }
  const app = new Vue({
      el: '#app',
      components: {
        HelloWorld
      },
      data: {
        msg: 'hello'
      }
    })
props

父组件控制子组件的值

在调用组件的时候通过text属性绑定一个值,在组件内部就可以通过props来接收这个值

通过props来接收调用的时候传过来的值。一旦接收了,就可以直接把props当data用,但是不能直接在内部修改props的值。这是基于单向数据流的原则的。

<div id="app">

  <my-text :text="text1"></my-text>
  <my-text text="world"></my-text>
  <my-text text="!"></my-text>
</div>
const MyText = {
  template: '<span>{{text}}</span>',
  props: ['text']
}
const app = new Vue({
  el: '#app',
  data: {
    text1: 'hello',
    text2: 'world',
    text3: '!'
  },
  components: {
    MyText
  }
})

如果要对传入的props进行类型检查,就需要使用对象的方式来写props

如果要对x进行更多约束,就可以再把这个x写成一个对象,里面可以有默认值,必须这些选项

  props: {
    x: {
      //判断属性
      type: Number,
      //必传值
      required: true
    },
    y: {
      type: Number,
      //默认值
      default: 0
    }
  }
}
props坑
<div id="app">
  <!-- 由于html的属性是忽略大小写的,所以在传递的时候要使用中线连接 -->
  <hello hello-text="hello world!"></hello>
</div>
<script src="./vue.js"></script>
<script>
const Hello = {
  template: '<div>{{helloText}}</div>',
  // 由于js的命名又是驼峰类型的,所以在接收的时候又得使用驼峰
  props: ['helloText']
}

如果想要通过子组件修改父组件的话,需要早子组件的按钮点击时间上,通过this.$emit触发一个自定义事件

在调用这个组件的时候,就通过 @事件名 这种方式去监听组件内部触发的自定义事件, 当内部有这个自定义事件触发的时候,就会执行app里的onChangeText方法

最终的数据修改在父组件里面

事件总线

兄弟组件,不能直接通信,需要通过事件总线实现通信

事件总线,相当于总指挥中心, 啥都不渲染。只是一个空的vue实例

同样通过$emit触发事件

const bus = new Vue()
上一篇下一篇

猜你喜欢

热点阅读