Vue.js 注意事项

1.传递参数时,第二个参数要与前面的逗号有一个空格
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(items))
2. 注意空格

正确格式

<script>
import Store from './store'
console.log(Store)
export default {
   ...
 }
</script>

错误格式

<script>
  import Store from './store'
  console.log(Store)
export default {
   ...
 }
</script>
3. 父向子组件传参

父组件中

//模板中
<template>
  <div id="app">
    //之前老版本  <conponent-a msgfromfather="父亲传给儿子!"></conponent-a>
    <ConponentA msgfromfather="父亲传给儿子!"></ConponentA>
  </div>
</template>

//Js
<script>
export default {
  //注册ConponentA
  components: {ConponentA},
}
</script>

子组件中

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <button v-on:click="onClickMe()">点我啊,小样儿</button>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        msg: 'hello from component A!'
      }
    },
    //props 可以是数组或对象,用于接收来自父组件的数据
    props: ['msgfromfather'],
    methods: {
      onClickMe: function () {
         //打印从父组件传过来的值
        console.log(this.msgfromfather)
      }
    }
  }
</script>

<style scoped>
  h1 {
    font-weight: normal;
  }
</style>

4. 子向父组件传参

儿子告诉父亲 需要使用vm.$emitvm.$on 触发事件和监听事件

子组件中

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h1>{{msgfromfather}}</h1>
    <button v-on:click="onClickMe()">点我啊,小样儿</button>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        msg: 'hello from component A!'
      }
    },
    methods: {
      onClickMe: function () {
//        子传父 触发当前实例上的事件
        this.$emit('child-tell-me-something', this.msg)
      }
    }
  }
</script>

<style scoped>
  h1 {
    font-weight: normal;
  }
</style>

父组件中

<template>
  <div id="app">
    <p>child tells me: {{childWorlds}}</p>
    <ConponentA msgfromfather="父亲传给儿子!" v-on:child-tell-me-something="listenToMyBoy"></ConponentA>
  </div>
</template>

<script>
import ConponentA from './components/componentA.vue'
export default {
  data: function () {
    return {
      childWorlds: ''
    }
  },
  components: {ConponentA},
  watch: {
    items: {
      handler: function (items) {
        Store.save(items)
      },
      deep: true
    }
  },
  methods: {
    //监听
    listenToMyBoy: function (msg) {
      console.log(msg)
      this.childWorlds = msg
    }
  }
}
</script>

除了这个方法外,还有其他方法,详见Vue.js官网

  • 自定义组件指定属性数据类型
export default {
  props: {
    slides: {
      type: Array,     //数组
      default: []      //默认值
    }
  },
  • 在加载完毕执行某个方法
  mounted () {
    this.loadxxx()
  }
  • @mouseover="xxxx" 鼠标进入(执行某个事件), @mouseout="xxxx" 鼠标移出(执行某个事件);
  • transiotions动画对leftright等无效,要想实现动画效果,只能用x轴了;
  • slot 插槽
  • this.abc = false 等同于 this['abc'] = false
  • 父组件style不添加scoped,这样他的子组件可以共用他的样式,也就是说,可以把子组件的样式,写在父组件中.
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
......
</style>
  • & 代表父元素
<!--css书写规范 可被继承的写在前面,不让继承的的写在后面-->

<style lang="stylus" rel="stylesheet/stylus">
  #app
    .tab
      display: flex
      width: 100%
      height: 40px
      line-height: 40px
      .tab-item
        flex: 1
        text-align: center
        /* & > a & 代表父元素 tab-item 子元素选择器 */
        & > a
          display: block
          font-style: 14px
          color: rgb(77,85,93)
          &.active
            color: rgb(240,20,20)
</style>
  • 1像素边框的实现
    在pc端可以通过下面的设置,来实现,
border-bottom: 1px solid rgba(7,17,27,0.1)

pc端1像素边框

但是,在移动端,由于dpi的概念,它的物理像素是设备像素的2倍(iPhone6手机),如果用上面的方法,获取到的边框线比1像素要粗!

  • 引入stylus
<style lang="stylus" rel="stylesheet/stylus">
  @import "./common/stylus/mixin.styl"
  #app
    .tab
      display: flex
      width: 100%
      height: 40px
      line-height: 40px
      .tab-item
        flex: 1
        text-align: center
        border-1px(rgba(7,17,27,0.1))
        /* & > a & 代表父元素 tab-item 子元素选择器 */
        & > a
          display: block
          font-style: 14px
          color: rgb(77,85,93)
          &.active
            color: rgb(240,20,20)
</style>
  • 一行显示 ,显示不全显示省略号
      /*设置一行显示 显示不全显示...*/
      white-space: nowrap
      overflow: hidden
      /*显示省略号*/
      text-overflow: ellipsis
  • 模糊高斯效果
    1.让自身边模糊
filter: blur(10px)
让自身边模糊
  1. 背景变模糊(仅仅在iOS上有效果)
backdrop-filter: blur(10px)
WechatIMG5.jpeg
  • 在前端开发中,只要设置了display: flex,它就变成了水平布局.
  • CSS中,上下margin是有重叠效果的,只显示一个margin的高度.
  • chrome浏览器中,最低只能显示12px的字体,小于12px的字体按12px显示.
  • CSS书写规则:
    影响布局的写在前面
    影响样式的写在后面
  • img标签的宽高建议写在标签里面
    img width="57" height="57" :src="food.icon"
  • Vue.js 1.0版本获取dom对象使用v-el,(Vue.js 1.0版本v-el已经废除)
//v-el:food-wraper 注意: 用中划线连接 不能使用驼峰
<div class="menu-wrapper" v-el:food-wraper>

调用的时候,使用驼峰

this.menuScroll = new BScroll(this.$els.foodWraper);
  • 获取dom节点的高度clientHeight;
item.clientHeight;
  • Math.abs()取正值 ; Math.round() 四舍五入成整数
  • 参数传递@click="selectMenu($index,$event)"index和点击事件event传递到下面的函数中
<li @click="selectMenu($index,$event)">
    ......
</li>
  • 设置圆
border-radius: 50%
  • 设置文字居中,如果把text-align: center设在当前元素上没效果,试试设置在它的父元素上看看!!!
text-align: center
  • 在Vue里,如果你的props是数组或者Object, 那么它的 default 就是一个函数, 并return一个默认的值
    props: {
      selectFoods: {
        type: Array,
        /* 在Vue里,如果你的props是数组或者Object, 那么它的 default 就是一个函数, 并return一个默认的值*/
        default() {
          return [];
        }
      },
      deliveryPrice: {
        type: Number,
        default: 0
      },
      minPrice: {
        type: Number,
        default: 0
      }
    }
  • forEach() 遍历
let total = 0;
this.selectFoods.forEach((food) => {
     total += food.price * food.count;
});
  • 设置阴影
box-shadow: 0px 4px 8px 0 orange
购物车阴影
  • 给对象添加新的属性(1)

/* 给对象新增属性 */
Vue.set(this.food, 'count', 1); // 给food对象新增了count属性,赋值为1

使用:

// 如果count的属性不存在,就新增count属性
 if (!this.food.count) {
    /* 给对象新增属性 */
    Vue.set(this.food, 'count', 1);
} else {
    this.food.count++;
}
  • 给对象添加新的属性(2)

this.seller = Object.assign({}, this.seller, response.data);
  • 获取dom使用v-el
<div class="list-content" v-el:list-content>
  • 获取子组件使用v-ref
<food :food="selectedFood" v-ref:food></food>
  • 主动触发浏览器重绘 let rf = el.offsetHeight;
  • 组件的 私有方法 , 公有方法

私有方法,不允许外部调用的,书写规范

 methods: {
/* 如果不允许被外部调用的话,在方法前加 "_" 下划线 */
  _show() {
        this.showFlag = true;
      }
}

公有方法,允许外部调用

methods: {
   /* 该方法可以被外部调用 */
  show() {
     this.showFlag = true;
  }
}
  • 设置图片宽高相等

html部分

<template>
  <div class="food">
    <div class="image-header">
      <i mg :src="food.image">
    </div>
  </div>
</template>

CSS部分 => 黑魔法 设置宽高相等 当设置padding-top: 100%时,它是相对于盒子的宽度计算的

<style lang="stylus" rel="stylesheet/stylus">
  .food

    ......

    .image-header
      position: relative
      width: 100%
      height: 0
      /* 黑魔法 设置宽高相等 当设置padding-top: 100%时,它是相对于盒子的宽度计算的 */
      padding-top: 100%
      /* 用绝对定位,设置宽高100%,把图片嵌套到父容器中 */
      img
        position: absolute
        top: 0
        left: 0
        width: 100%
        height: 100%
</style>
宽高相等的图片

----------------------------以下已经废掉----------------------------

  • 子组件向父组件派发事件儿this.$dispatch('ratingtype.select', type);

    methods: {
      select(type, event) {
        if (!event._constructed) {
          return;
        }
        this.selectType = type;
        /* 向父组件派发事件 */
        this.$dispatch('ratingtype.select', type);
      }
    }

在父组件events方法中,监听这个事件

    events: {
      'ratingtype.select'(type) {
        this.selectType = type;
        /* 异步刷新UI */
        this.$nextTick(() => {
          this.scroll.refresh();
        });
      }
    }

------------------------------以上已经废掉-------------------------

  • 数组过滤 filter()

computed: {
      /* 计算出推荐的数组 */
      positives() {
        return this.ratings.filter((rating) => {
          return rating.rateType === POSITIVE;
        });
      },
      /* 计算出吐槽的数组 */
      negatives() {
        return this.ratings.filter((rating) => {
          return rating.rateType === NEGATIVE;
        });
      }
    },
  • :class如果绑定的内容是对象的话,可以为多个对象!

如下:

 <span :class="{'icon-thumb_up':rating.rateType===0,'icon-thumb_down':rating.rateType===1}"></span>
  • 设置圆:border-radius: 50%
border-radius: 50%
  • 不同结构(标签)水平布局,css需要设置vertical-align: top,
    相同结构(标签)水平布局,不需要设置。
  • 给特殊尺寸屏幕做适配 @media only screen and (max-width: 320px)
.overview-left
   flex: 0 0 137px
   padding: 6px 0
   width: 137px
   border-right: 1px solid rgba(7, 17, 27, 0.1)
   text-align: center
   /* 适配小屏幕 320px 手机 */
   @media only screen and (max-width: 320px)
      flex: 0 0 120px
      width: 120px

-img标签src前面一定要交“ : ”,不然报错!!!

![](rating.avatarxcz)
  • 年月日

html中

<div class="time">
   {{rating.rateTime | formatDate}}
</div>

js中
先引用进来

import {formatDate} from 'common/js/date';
filters: {
   formatDate(time) {
     let date = new Date(time);
     return formatDate(date, 'yyyy-MM-dd hh:mm');
   }
}
时间处理
  • 对象也可以是一个函数

data() {
      return {
        favorite: (() => {
          return loadFromLocal(this.seller.id, 'favorite', false); // 他的返回值是 true or false;
        })()
      };
}
  • router-viewkeep-alive属性,保证该视图只渲染一次,来回切换不重复渲染

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

推荐阅读更多精彩内容