style与class

  1. # 当变量为true的时候才显示 active class
  2. <div :class="{ active: isActive }"></div>
  3. <div
  4. class="static"
  5. :class="{ active: isActive, 'text-danger': hasError }"
  6. ></div>
  7. => <div class="static active"></div>
  8. # 更复杂点的判断逻辑推荐使用 computed
  9. <div v-bind:class="classObject"></div>
  10. data: {
  11. isActive: true,
  12. error: null
  13. },
  14. computed: {
  15. classObject: function () {
  16. return {
  17. active: this.isActive && !this.error,
  18. 'text-danger': this.error && this.error.type === 'fatal'
  19. }
  20. }
  21. }
  22. # 数组 + 三元表达式
  23. <div :class="[isActive ? activeClass : '', errorClass]"></div>
  24. <li :class="['menu-item', {'currentview': currentview === menuItem.key}]" ></li>

内联语法

  1. <div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
  2. 直接绑定到一个样式对象通常更好,这会让模板更清晰:
  3. <div v-bind:style="styleObject"></div>
  4. data: {
  5. styleObject: {
  6. color: 'red',
  7. fontSize: '13px'
  8. }
  9. }

计算属性与侦听器

  1. computed: {
  2. // 计算属性的 getter
  3. reversedMessage: function () {
  4. // `this` 指向 vm 实例
  5. return this.message.split('').reverse().join('')
  6. }
  7. }
  1. data: {
  2. firstName: 'Foo',
  3. lastName: 'Bar',
  4. fullName: 'Foo Bar'
  5. },
  6. watch: {
  7. firstName: function (val,oldval) {
  8. this.fullName = val + ' ' + this.lastName
  9. },
  10. lastName: function (val,oldval) {
  11. this.fullName = this.firstName + ' ' + val
  12. }
  13. }

过滤器

  1. <!-- 在双花括号中 -->
  2. {{ message | capitalize }}
  3. <!-- `v-bind` -->
  4. <div v-bind:id="rawId | formatId"></div>
  5. # js
  6. filters: {
  7. capitalize: function (value) { # value |之前的那个值
  8. if (!value) return ''
  9. value = value.toString()
  10. return value.charAt(0).toUpperCase() + value.slice(1)
  11. }
  12. }
  13. # 接受传参的情况
  14. {{ message | filterA('arg1', arg2) }}
  15. filters message还是在函数的第一个参数

mixins

  1. # 一个混入对象可以包含任意组件选项
  2. var mixin = {
  3. created: function () {
  4. // this.hello()
  5. },
  6. data: function () {
  7. return {
  8. message: 'hello',
  9. foo: 'abc'
  10. }
  11. }
  12. methods: {
  13. hello: function () {
  14. console.log('hello from mixin!')
  15. }
  16. }
  17. }
  18. # 混入的时候
  19. # 当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”。
  20. new Vue({
  21. mixins: [mixin],
  22. data: function () {
  23. return {
  24. message: 'goodbye',
  25. bar: 'def'
  26. }
  27. },
  28. created: function () {
  29. console.log(this.$data)
  30. // => { message: "goodbye", foo: "abc", bar: "def" }
  31. }
  32. })

extend与$mount

webpack main.js 的入口

  1. import Vue from 'vue';
  2. import App from './app.vue';
  3. new Vue({
  4. el: '#app',
  5. render: h => h(App)
  6. });

Webpack 基本都是前端路由的,它的 html 里一般都只有一个根节点 <div id="app"></div>,其余都是通过 JavaScript 完成

有了初始化的实例,之后所有的页面,都由 vue-router 帮我们管理,组件也都是用 import 导入后局部注册(也有在 main.js 全局注册的),不管哪种方式,我们只是写好 .vue 文件并导入即可,组件(或页面)的创建过程我们是无需关心的 ( 页面的创建过程:规避掉了 dom的操作细节

特点:

  1. 所有的内容,都是在 #app 节点内渲染的;
  2. 组件的模板,是事先定义好的;
  3. 由于组件的特性,注册的组件只能在当前位置渲染

换句话说,常规的组件使用方式,只能在规定的地方渲染组件,这在一些特殊场景下就比较局限了,例如:

  1. 组件的模板是通过调用接口从服务端获取的,需要动态渲染组件;(组件的渲染是异步的,甚至预先不知道模板是什么
  2. 实现类似原生 window.alert() 的提示框组件,它的位置是在 <body> 下,而非 <div id="app">,并且不会通过常规的组件自定义标签的形式使用,而是像 JS 调用函数一样使用。

那么怎么 将创建的组件 在页面的任意一个dom节点上渲染呢? 而不是默认的根组件
====》 Vue.extend 配合 $mount

  1. import Vue from 'vue';
  2. # Vue.extend 的作用,就是基于 Vue 构造器,创建一个“子类“
  3. # 解决了 异步获取template的问题
  4. const AlertComponent = Vue.extend({
  5. template: '<div>{{ message }}</div>',
  6. // data 里 返回的是函数
  7. data () {
  8. return {
  9. message: 'Hello, Aresn'
  10. };
  11. },
  12. });
  13. # 接下来 手动渲染组件 挂载在body
  14. const component = new AlertComponent().$mount(); # mount手动渲染
  15. document.body.appendChild(component.$el);
  16. # 简写=>
  17. // 在 $mount 里写参数来指定挂载的节点
  18. new AlertComponent().$mount('#app');
  19. // 不用 $mount,直接在创建实例时指定 el 选项
  20. new AlertComponent({ el: '#app' });

我们是用 $mount 手动渲染的组件,如果要销毁,也要用 $destroy 来手动销毁实例,必要时,也可以用 removeChild 把节点从 DOM 中移除

同样可以手动渲染的:(就是云雅的那个例子
===> 既能用写.vue文件引入模板(毕竟在 template 里堆字符串很痛苦),又可以根据需要传入适当的 props,还可以 手动渲染组件 实现任意节点挂载
==> 使用 render函数

  1. import Vue from 'vue';
  2. import Notification from './notification.vue';
  3. const props = {}; // 这里可以传入一些组件的 props 选项
  4. const Instance = new Vue({
  5. render (h) {
  6. return h(Notification, {
  7. props: props # 通过props传数据给模板; (比如后端的数据
  8. });
  9. }
  10. });
  11. const Instance = new Vue({
  12. el:body,
  13. renderh=>h(Notification,{
  14. props:{xxxdata}
  15. })
  16. });
  17. const component = Instance.$mount();
  18. document.body.appendChild(component.$el);

渲染后,如果想操作 Render 的 Notification 实例,因为 Instance 下只 Render 了 Notification 一个子组件,所以可以用 $children[0] 访问到。


  1. const notification = Instance.$children[0];