日常

vue.js

基础:

Vue构造器:Vue.extend(options)

  • 是vue构造器的扩展,调用Vue.extend创建的是一个vue构造器。参数是一个包含组件选项的对象。
  • options中的属性:
    • template属性用于定义组件要渲染的html。在vue.extend()的选项中data必须是函数;
  • 注意:调用vue.extend生成的是一个组件构造器,不能直接拿来渲染的,必须要使用vue.component来进行注册;

全局组件:Vue.component()

  • 参数:2个:
    • 第一个参数:组件的标签;
    • 第二个参数是组件构造器;
    • 组件应当挂载到某个vue实例上,否则不会生效;
Vue.component('组件名',{ 
    // 选项(组件)
})

组件语法糖:

  • 由于以上注册组件的过程过于繁杂,vue提供了注册语法糖:使用vue.component()直接创建和注册组件;
  • 用法:vue.component(name, options)
  • 参数:
    • name: 组件标签名;
    • options:选项对象

Vue.set(target,key,value)/this.$set(target,key,value)

  • 应用场景:当生成VUE实例后,修改date中属性的值有时视图并不会同步更新,(即如果在实例创建后添加新的属性到实例上,他不会触发视图更新)
  • 原因:Vue的双向绑定时基于set和get的
  • 解决方法:使用Vue.set/this.$set来添加新属性;
  • Vue.set(target,key,value)
  • 参数:
    • target: 要添加属性的对象(目标对象)
    • key: 要添加的属性
    • value:属性值
      -eg:

  
  • 正常类: {{earnings.a}}
  • 宝宝类: {{earnings.b}}
  • 活期存款: {{earnings.c}}
  export default {
    data () {
      return {
        earnings: {},
        }
    },
    methods: {
        getNum () {
            this.earnings.a = 1
            this.earnings.b = 2
            this.earnings.c = 3
        }
    } 
// 1.如上点击button按钮,视图不会更新;
// 2.将getNum函数改写成如下形式,即可式对象earnings的属性变成响应式的
   getNum () {
       this.$set(earnings, 'a', 1)
       this.$set(earnings, 'b', 2)
       this.$set(earnings, 'c', 3)
   }

this.$nextTick([callback, context])/Vue.nextTick([callback, context])

  • 应用场景:有时我们通过更改数据 配合v-html更新dom,然后获取更新后的dom,但 数据更新后dom不会马上更新完成,此时就应用到了this.$nextTick;
  • 作用:在下次Dom更新循环结束之后执行回掉,在数据更新之后立即调用该方法,获取更新后的Dom;

理解:

  • vue.js是一个构建数据驱动的web界面的库。Vue.js的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件
  • vue.js自身并不是一个全能框架,它只聚焦于视图层。因此学习起来比较容易,它也非常容易和其他库已有项目整合。另一方面,在与相关工具和支持库一起使用市,vue.js也能完美驱动复杂的但也应用。
  • vue.js的核心是一个响应的数据绑定系统,它让数据与Dom保持同步非常简单。在使用jquery手动操作DOM时,我们的代码常常是命令式的,重复的与易错的,vue.js用数据驱动的视图的概念,通俗的讲,将意味着我们在普通的HTML模板中使用特殊的语法将DOM‘绑定’到数据层,一旦创建了绑定,DOM将和数据保持同步。每当修改了数据,DOM便相应的更新。这样我们应用中的逻辑几乎都是修改数据了,比与DOM更新搅在一起。这让我们的代码更容易撰写,理解与维护

vue.js中使用到的两个重要函数。

  • Object.defineProperty(object, propertyname, decriptor)
  • eg: 添加属性访问器
var obj = {},newVal;
 // Add an accessor property to the object.
 Object.defineProperty(obj, "name", {
     set: function (x) {
         console.log("in property set accessor" + newVal);
         this.firstName= x;
     },
     get: function () {
         console.log("in property get accessor" + newVal);
         return this.firstName;
     },
     enumerable: true,
     configurable: true
 });

vue和angular的

vuex严格模式

开启严格模式;

const store = new Vuex.Store({
  // ...
  strict: true
})

JSlint语法要求

  • 代码文档结尾要留白一行;
  • 一句代码结尾不能用 ‘;’,不能有空格
  • 注释格式‘空格 // 注释内容’

严格模式中this的指向

  • 严格模式中自调用函数this不指向window,指向undefined

bind

  • 和apply, call作用类似,只是bind不会改变原函数的this指向,他会返回一个新的函数,改变新函数的this指向为指定的值,新函数的函数体和原函数一样

  • eg

this.x = 9; 
var obj = {
  x: 81,
  getX: function() { return this.x; }
};

obj.getX(); // 返回 81

var retrieveX = obj.getX;
retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域

// 创建一个新函数,将"this"绑定到module对象
// 新手可能会被全局的x变量和module里的属性x所迷惑
var boundGetX = retrieveX.bind(obj);
boundGetX(); // 返回 81

路由懒加载;

  • 使用原因:使用vue写单页面应用时,会出现打包后javascript包非常的大,影响页面加载,可以用路由懒加载的方法去优化路由,当用到某个路由时在去加载对应的模块;
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      component: resolve => require(['components/Hello.vue'], resolve)
    },
    {
        path: '/about',
        component: resolve => require(['components/About.vue'], resolve)
    }
  ]
})

vue中watch

  • 用来添加监视,其值为一个对象,要观察的数据以键值的形式写入其中,(一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。)
    • 键为要观察的数据,值为一个函数表达式,函数表达式有两个参数;第一个为新值,第二个为老值(变化前的值),
    • 当药观察的数据发生改变时,会执行对应键的函数表达式;

element-ui

  • 模态框可以通过 v-model来呼出,取值为boolean

es6向外暴露模块的方法;

  • export
    • export { 要暴露的变量名 }
    • export var/ const/let 变量名 = 对象/function
  • export default = obj
  • module exports = object/function

eg:

1.第一种方法:
const form = {
  id: input().protect(true).value(),
  name: RI().label('姓名').val('').type('text').checkDefault().value(),
    
    }
    
export { form } // 向外暴露一个form对象

app.use()

  • 参数:obj|function
  • 安装vue.js插件式如果插件是一个对象,必须提供install方法,如果插件是一个函数,那么它会被作为install方法,install方法将被作为vue的参数;

vue的特殊属性

slot :内容分发插槽

  • 具名插槽/和匿名插槽: 可以使用元素的一个特殊属性name来配置如何分发内容,将给据name属性来进行内容匹配,可以使用一个匿名插槽作为默认插槽,负责匹配不到插槽的能容将被抛弃。
  • eg:
- 假定有一个app-layout组件,其模板为:

- 父组件模板:

这里可能是一个页面标题

主要内容的一个段落。

另一个主要段落。

这里有一些联系信息

- 选人结果为:

这里可能是一个页面标题

主要内容的一个段落。

另一个主要段落。

这里有一些联系信息

  • 注意:如果子组件中没有匿名插槽,那么匹配不到插槽的那部分内容将被抛弃

计算属性

  • 使用计算属性的原因:模板内表达式是非常便利的,但是他们实际是用于简单运算的,在模板中放入太多逻辑会让模板过重且难以维护。
  • eg:

Original message: "{{ message }}"

Computed reversed message: "{{ reversedMessage }}"


var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // a computed getter
    reversedMessage: function () {
      // `this` points to the vm instance
      return this.message.split('').reverse().join('')
    }
  }
})

  • 计算属性(computed)VS被观察的属性
  • 当某一个值A依赖于另外两个值BC且,当BC中任意一个值发生改变是A的值也要发生改变,此时使用计算属性,比watch更简洁。
  • eg:
{{ fullName }}
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

//上面代码时命令式的和重复的,使用计算属性书写如下,会变得简洁明了


var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})
  • 何时使用watch?
    • 当你想要在数据变化响应时,执行一步操作,或者开销较大的操作时使用。

ES6新增的数组方法:

  • reduce( function(accumulator, currentValue, currentIndex, array), initialValue) :为数组中的每一个元素一次执行回掉函数,不包括数组中被删除的或者从未被赋值的元素
  • 参数:
    • callback :执行数组中每个值的函数
      • 参数四个:accumulator:上一次 回掉的返回值
      • currentValue:正在处理的元素
      • currentIndex:正在处理的元素的索引
      • array: 调用reduce的数组
    • initialValue :可选项,气质用于地磁调用callback的第一个参数,如果没有设置初始值,则将数组中的第一个元素作为初始值,空数组调用reduce

总结:数组中的元素每次执行callbak函数会将return的值赋给accumulator

webpack config文件配置

var path = require('path');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin'); //css单独打包
var HtmlWebpackPlugin = require('html-webpack-plugin'); //生成html


var ROOT_PATH = path.resolve(__dirname);
var APP_PATH = path.resolve(ROOT_PATH, 'src'); //__dirname 中的src目录,以此类推
var APP_FILE = path.resolve(APP_PATH, 'App.jsx'); //根目录文件app.jsx地址
var BUILD_PATH = path.resolve(ROOT_PATH, '/pxq/dist'); //发布文件所存放的目录

module.exports = {
    devtool: 'cheap-module-eval-source-map',
    entry: {
        app: APP_FILE
    },
    output: {
        publicPath: '/pxq/dist/', //编译好的文件,在服务器的路径,这是静态资源引用路径
        path: BUILD_PATH, //编译到当前目录
        filename: '[name].js', //编译后的文件名字
        chunkFilename: '[name].[chunkhash:5].min.js',
    },
    module: {
        loaders: [{
            test: /\.js$/,
            exclude: /^node_modules$/,
            loader: 'babel',
            include: [APP_PATH]
        }, {
            test: /\.css$/,
            exclude: /^node_modules$/,
            loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer']),
            include: [APP_PATH]
        }, {
            test: /\.less$/,
            exclude: /^node_modules$/,
            loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer', 'less']),
            include: [APP_PATH]
        }, {
            test: /\.scss$/,
            exclude: /^node_modules$/,
            loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer', 'sass']),
            include: [APP_PATH]
        }, {
            test: /\.(eot|woff|svg|ttf|woff2|gif|appcache)(\?|$)/,
            exclude: /^node_modules$/,
            loader: 'file-loader?name=[name].[ext]',
            include: [APP_PATH]
        }, {
            test: /\.(png|jpg)$/,
            exclude: /^node_modules$/,
            loader: 'url-loader?limit=8192&name=images/[hash:8].[name].[ext]',
            //注意后面那个limit的参数,当你图片大小小于这个限制的时候,会自动启用base64编码图片
            include: [APP_PATH]
        }, {
            test: /\.jsx$/,
            exclude: /^node_modules$/,
            loaders: ['jsx', 'babel'],
            include: [APP_PATH]
        }]
    },
  plugins: [
    new htmlwebpackPlugin({ // 生成html文件配置;
      // 生成html文件的名字,路径和生产环境下的不同,要与修改后的publickPath相结合,否则开启服务器后页面空白
      filename: 'index.html',
      // 源文件,路径相对于本文件所在的位置
      template: path.resolve(__dirname, 'index.html'),
      // 需要引入entry里面的哪几个入口,如果entry里有公共模块,记住一定要引入
      // chunks: ['vendors', 'index'],
      // 要把
                    
                    

你可能感兴趣的:(日常)