Vue

2018-11-17  本文已影响0人  简爱的三年

computed 计算属性


computed的结果会被缓存,除非依赖的响应式属性变化才会重新计算,主要当做属性来使用。

  var vm = new Vue({
    el: '#app',
    computed: {
      name() {
        return 111
      }
    }
  })

watch 监听属性

被监听的属性值一发生变化就会触发 watch

  var vm = new Vue({
    el: '#app',
    data: {
      name: 'aaa'
    },
    watch: {
      'name': function (newVal, oldVal) {
          console.log(newVal)   //  最近变化的新值
          console.log(oldVal)   //  以前的旧值
       }
    }
  })

父子组件传递数据

(1) 子组件获取父组件的数据

  <div id="app">
    <child :sendMsg="msg"></child>
  </div>
var child = {
  template: '<input @click="getMsg">  猜我说了啥   {{ sendMsg }}   </input>',
  data () {},
  methods: {
    getMsg() {
       console.log( this.sendMsg  )
      }
  },
  props: ['sendMsg']
}
var  vm = new Vue({
  el: '#app',
  data: {
    msg: '媛问:猿哥一起嗨啊'
  },
  components: {
    child
  }
})

(2)子组件获取父组件的方法 并向父组件传递数据。

  <div id="app">
    <child @sendWay="way"></child>
  </div>
var child = {
  template: '<input>   </input>' ,
  data() {
    return {
      title: '猿'
    }
  },
  methods: {
    getWay() {
      this.$emit('sendWay', this.title)
    }
  }
}


var vm = new Vue({
  el: '#app',
  data: {
    from: ''
  },
  methods: {
    way(t) {
      this.from = t
    }
  }
})

ref 获取DOM 元素 和 组件

获取DOM元素

<div>
  <h3 ref="txt">丫丫滴滴啪啪</h3>
</div>
var vm = new Vue({
    el: '#app',
    data: {
        
    },
    methods: {
      getElement(){
        this.$refs.txt.innerText    //   输入h3 的文本内容
      }
    }
})

获取组件

  var tpl = {
    template: '<h1 ref="child">子组件</h1>',
    data () {
      return {
        some: '一点东西'
      }
    },
    methods: {
      way () {
          console.log('噜噜噜')
       }
    }
  }
  
  var vm = new Vue({
    el: '#app',
    data: {},
    methods: {
      getChild () {
          this.$refs.child.innerText        //   子组件
          this.$refs.child.some      //  获取子组件中定义的数据    ‘一点东西’
          this.$refs.child.way()    //   获取子组件中的方法,  '噜噜噜'
        }
    },
    components: {
      tpl
    }
  })

Router

  <div class="app">
    <!-- 相对于a 标签, tag属性可以改变元素的状态,不影响跳转 --> 
    <router-link to="/login" tag="button">登录</router-link>  
    <router-link to="/register" tag="p">注册</router-link>
    <!-- 占位符  路由组件将放在这里显示 -->
    <router-view></router-view>
  </div>
var login = {
      template: '<h1>登录组件</h1>',
    }
    var register = {
      template: '<h1>注册组件</h1>'
    }

    var router = new VueRouter({
      routes: [
        // component 必须是组件的模板对象,不能是组件的引用名称
        {path: '/login', component: login},
        {path: '/register', component: register}
      ]
    })

    var vm = new Vue({
      el: '.app',
      data: {},
      
      router: router   // 暴露在 vm 实例对象
    })

路由 redirect 重定向

  {path: '/', redirect: '/login'},

组件间切换的动画效果:

组件过渡过程中,会有四个CSS类名进行切换,这四个类名与transition的name属性有关,比如name="fade",会有如下四个CSS类名:

  <style>
    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateX(100px)   
    }

    .v-enter-active,
    .v-leave-active {
      transition: all .5s ease
    }
  </style>

  <div class="app">
    <router-link to="/login" tag="button">登录</router-link>
    <router-link to="/register" tag="p">注册</router-link>
    <!-- 占位符  路由组件将放在这里显示 -->
    <transition mode="out-in">   
      <router-view></router-view>
    </transition>
  </div>

路由传参1

  <router-link to="/login?id=111">  登录 </login>

获取参数

  this.$route.query.id    //  id= 111
image.png

路由传参2

    <router-link to="/login/222" tag="button">登录</router-link>
    <router-link to="/register/333" tag="p">注册</router-link>
routes: [
        // component 必须是组件的模板对象,不能是组件的引用名称
        {path: '/', redirect: '/login'},
        {path: '/login/:id', component: login},
        {path: '/register/:id', component: register}
      ]
    })
created() {
        console.log(this.$route.params.id)    // 222 
      },
image.png

使用render 渲染组件

我们不光可以使用components渲染组件,还可以用 render 属性来渲染组件
看代码:

html:

  <div class="app">
    <h2>render 会替换掉整个元素</h2>
  </div>

js:

  var com = {
    template: '<div>这是一个登陆组件</div>'
  }
  var vm = new Vue({
    el: '.app',
    render: function (createElement) {
      return createElement(com)  // createElement 是一个函数 参数是模板对象 , 返回的结果将替换 el 指向的元素
    }
  })

与components不同的是 render属性会覆盖整个dom 元素,只能放一个组件,components 却可以放多个组件

文件的导入和导出

es6 提供了文件的导入和导出,但是不能直接通过浏览器运行,需要借助bable 进行转码,才可以使用
export default : 将文件导出

test.js :

  export default {
    name: '张三',
    age: 20
  }

import : 导入文件
main.js :

  import file from './test.js'

使用 export default 只能导出一个对象

export
按需要导出成员,可以向外暴露多个成员

test.js:
  export var title = '一只猿'   // 导出成员
  export var o = '一只媛'   
  import {title, o} from './test.js'   // 名称必须一致

使用 {} 的方式来接收多个成员,不需要的成员可以不用接收 {title}

上一篇下一篇

猜你喜欢

热点阅读