前端笔记

1. Css

1).使用 text-align-last 对齐两端文本

  text-align-last: justify;

2).黑白图像

让你的彩色照片显示黑白照片

img.desaturate {

    filter: grayscale(100%);

    -webkit-filter: grayscale(100%);

    -moz-filter: grayscale(100%);

    -ms-filter: grayscale(100%);

    -o-filter: grayscale(100%);

}

3).使用rem进行全局大小调整;使用em进行局部大小调整

在设置根目录的基本字体大小后,例如html字体大小:15px;,可以将包含元素的字体大小设置为rem

article {   

    font-size: 1.25rem; 

}   

aside {   

    font-size: .9rem; 

}

将文本元素的字体大小设置为em

h2 {   

    font-size: 2em; 

}   

p {   

    font-size: 1em; 

}



2.js

​1).格式化金钱


const ThousandNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

const money = ThousandNum(20190214);

// money => "20,190,214"


2).取整


代替整数的 Math.floor(),代替负数的 Math.ceil()


const num1 = ~~ 1.69;

const num2 = 1.69 | 0;

const num3 = 1.69 >> 0;

// num1 num2 num3 => 1 1 1


3).转数值


只对 null 、"" 、false 、数值字符串 有效


const num1 = +null;

const num2 = +"";

const num3 = +false;

// num1 num2 num3 num4 => 0 0 0


​4).去重数组


const arr = [...new Set([0, 1, 1, null, null])];

// arr => [0, 1, null]


​5).交换赋值


let a = 0;

let b = 1;

[a, b] = [b, a];

// a b => 1 0


6).​创建指定长度且值相等的数组


const arr = new Array(3).fill(0);

// arr => [0, 0, 0]



7).​克隆对象


const _obj = { a: 0, b: 1, c: 2 }; // 以下方法任选一种

const obj = { ..._obj };

const obj = JSON.parse(JSON.stringify(_obj));

// obj => { a: 0, b: 1, c: 2 }


3.Vue


1).路由懒加载

import Vue from 'vue'

import Router from 'vue-router'

Vue.use(Router)

const router = new Router({

  routes: [

    {

      path: '/',

    name:"home"

      component: () => import("xxx")

    }, {

      path: '*', // 404 页面

      component: () => import('./notfind')

    },

]

})

​2).页面需要导入多个组件

原来的写法

import titleCom from '@/components/home/titleCom'

import bannerCom from '@/components/home/bannerCom'

import cellCom from '@/components/home/cellCom'

components:{titleCom,bannerCom,cellCom}

利用 require.context 可以写成

const path = require('path')

const files = require.context('@/components/home', false, /\.vue$/)

const modules = {}

files.keys().forEach(key => {

  const name = path.basename(key, '.vue')

  modules[name] = files(key).default || files(key)

})

components:modules

API 说明

实际上是 webpack 的方法,vue 工程一般基于 webpack,所以可以使用

require.context(directory,useSubdirectories,regExp) >

接收三个参数:

directory:说明需要检索的目录

useSubdirectories:是否检索子目录

regExp: 匹配文件的正则表达式,一般是文件名

​3).动态组件

做一个 tab 切换时就会涉及到组件动态加载

<component v-bind:is="currentTabComponent"></component>

但是这样每次组件都会重新加载,会消耗大量性能,所以 <keep-alive> 就起到了作用

<keep-alive>

  <component v-bind:is="currentTabComponent"></component>

</keep-alive>

这样切换效果没有动画效果,这个也不用着急,可以利用内置的 <transition>

<transition>

<keep-alive>

  <component v-bind:is="currentTabComponent"></component>

</keep-alive>

</transition>

​4.为路径设置别名

在开发过程中,我们经常需要引入各种文件,如图片、CSS、JS 等,为了避免写很长的相对路径(../),我们可以为不同的目录配置一个别名

// vue-cli 2.x 配置

// 在 webpack.base.config.js中的 resolve 配置项,在其 alias 中增加别名

resolve: {

    extensions: ['.js', '.vue', '.json'],

    alias: {

      'vue$': 'vue/dist/vue.esm.js',

      '@': resolve('src'),

    }

  },

// vue-cli 3.x 配置

// 在根目录下创建vue.config.js

var path = require('path')

function resolve (dir) {

  console.log(__dirname)

  return path.join(__dirname, dir)

}

module.exports = {

  chainWebpack: config => {

    config.resolve.alias

      .set(key, value) // key,value自行定义,比如.set('@@', resolve('src/components'))

  }

}

自定义目录webpack

在写代码的时候,很多时候都存在这种情况 :

import component1 from "../../../../component"

import component2 from "../../../../../component"

这种代码是新手很可能出现的,如果一旦出现一个层级目录出问题了,或者是文件的位置被转移过了就会出问题。看过之前我写的webpack文航的都会知道。

module.exports = {

  context: path.resolve(__dirname, '../'),

  entry: {

    app: ['babel-polyfill', './src/main.js']

  },

  output: {},

  resolve: {

    extensions: ['.js', '.vue', '.json'],

    alias: {

      'vue$': 'vue/dist/vue.esm.js',

      '@': resolve('src'),

      'components': resolve('src/components'),

      'pages': resolve('src/pages')

    }

  },

  module: {

},

  node: {

  },

  plugins: [],

}

在resolve->alias里面可以配置绝对相对路径,在使用的时候

import component1 from "pages/component"

import component2 from "pages/component"

​5).img 加载失败

有些时候后台返回图片地址不一定能打开,所以这个时候应该加一张默认图片

// page 代码

<img :src="imgUrl" @error="handleError" alt="">

<script>

export default{

  data(){

    return{

      imgUrl:''

    }

  },

  methods:{

    handleError(e){

      e.target.src=reqiure('图片路径')

    }

  }

}

</script>

6).全局定义

我们在写代码的时候,很有可能会封装很多库。如果存在有很多页面都在使用该库的情况,很可能会出现下面的代码:

// vue 1

import utils from "library"

// vue 2

import utils from "library"

...

// vue n

import utils from "library"

就像我封装的http方法一样,我一般会这样处理

import Vue from 'vue'

import http from "http/http"

Vue.prototype.$okhttp = http

// use

this.$okhttp

这样会节省很多没有必要的代码量

7).代理解决跨域

有些时候,在进行本地开发的时候,可能会遇到跨域的问题。为了解决这个问题呢?主要有两种方法:

1、 服务器设置

服务端设置很简单,就是将本地开发的东西加上“Access-Control-Allow-Origin”, “*”,或者是直接将本地开发的ip直接设置成白名单,这样就可以了.

2、 本地代理

首先引入

npm install http-proxy-middleware --save

然后在index.js的标签下proxyTable使用

'/lesson': {

        target: 'http://xxx/v2/webapi/lesson', // 代理的网址

        changeOrigin: true, // 允许跨域

        pathRewrite: {

        '^/lesson': '/'

      }

  }

使用的时候,就直接使用

axios({

        method: 'get',

        url:'/lesson' ,

        params: qs.stringify(data)

      }).then(function (res) {

        if (res) {

          //...

        }

      });

    }).catch(function (error) {

      console.error(error);

    })

8). 页面统一判断

在开发中经常会遇到权限判断的问题,我们又不可能在每一个页面的生命周期中去判断一下,那样太消耗时间了,我的处理:

router.beforeEach((to, from, next) => {

  myAccess.checkhaveAccess(to.path) === true ? next() : next('/forbid')

})

9).事件的传递:

一般来说事件的传递有很多种,比如父子之间传递数据就可以直接用props,和emit来做关联。

父组件给子组件传递

// 父组件

<parent>

    <child :datas="content"></child>

</parent>

data(){

    return {

        content:'sichaoyun'

    };

}

// 子组件

props:["datas"];

// 或者是

props: {

datas: String

}

子组件给父组件传递

// 子组件

<template>

    <div @click="open"></div>

</template>

methods: {

  open() {

        this.$emit('showbox','the msg'); //触发showbox方法,'the msg'为向父组件传递的数据

    }

}

// 父组件

<child @showbox="toshow" :msg="msg"></child> //监听子组件触发的showbox事件,然后调用toshow方法

methods: {

    toshow(msg) {

        this.msg = msg;

    }

}

兄弟组件之间的传递一般有几种方式:

1、 注册全局事件

2、 vuex

3、 localstorage

关于后面两个,我会专门来讲这个的,我主要是讲全局事件吧,代码如下:

let vm = new Vue(); //创建实例

//组件1

<div @click="ge"></div>

methods: {

    ge() {

        vm.$emit('click',data); //触发事件

    }

}

//组件2

<div></div>

created() {

  vm.$on('click', (arg) => {

    });

}

10).列表渲染

v-for循环绑定model:

这个是我在一个微信公众号上面看到的写法,很新颖:

// 数据   

      data() {

          return{

          obj: {

              ob: "OB",

              koro1: "Koro1"

            },

            model: {

              ob: "默认ob",

              koro1: "默认koro1"

            } 

          }

      },

    // html模板

    <div v-for="(value,key) in obj">

      <input type="text" v-model="model[key]">

    </div>

      // input就跟数据绑定在一起了,那两个默认数据也会在input中显示

11).深度watch与watch立即触发回调

这个是我偶尔在vuejs官网上面发现的,watch有两个可选参数,但是好像版本有限制,具体请移步官方文档。查看版本信息

选项:deep

在选项参数中指定 deep: true,可以监听对象中属性的变化。

选项:immediate

在选项参数中指定 immediate: true, 将立即以表达式的当前值触发回调,也就是默认触发一次。



素材摘自《前端开发小技巧(Vue、JS、CSS)》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343