Elm仿饿了么vuejs app学习笔记

两端横线,中间文字

<div class="line"></div>

<div class="text"></div>
<div class="line"></div>


.title
 display:flex
.line
flex:1----------------------------------------------------------------flex弹性布局
position:relative
top:-6px
border-bottom: 1px solid rgba(255, 255, 255, 0.2)------------------横线的效果
.text
padding:0 12px
font-size:14px




postcss工具-------》自动补齐兼容性css代码
 
 
mixin方法:

border-1px($color)
  position: relative
  &:after
    display: block
    position: absolute
    left: 0
    bottom: 0
    width: 100%
    border-top: 1px solid $color
    content: ' '

border-none()
  &:after
    display:none


设置最后一个元素没有底边的:
.food-item
  display:flex
  margin:18px
  border-1px(rgba(7,17,27,0.1))------>1px border-bottom设置display:block  
  &:last-child
     border-none()  ---------->设置底边display:none


 
 
  <ul>
<li @click="selectFood(food,$event)" v-for="food in item.foods" class="food-item border-1px">------------每一个食品分类进行遍历。点击某一个食品,跳转商品详情页面。
 <div class="icon">
<img width="57" height="57" :src="food.icon">
 </div>
 <div class="content">
<h2 class="name">{{food.name}}</h2>
<p class="desc">{{food.description}}</p>
<div class="extra">
 <span class="count">月售{{food.sellCount}}份</span><span>好评率{{food.rating}}%</span>
</div>
<div class="price">
 <span class="now">¥{{food.price}}</span><span class="old"
v-show="food.oldPrice">¥{{food.oldPrice}}</span>
</div>
<div class="cartcontrol-wrapper">
 <cartcontrol :food="food"></cartcontrol>
</div>
 </div>
</li>
  </ul>


<food :food="selectedFood" v-ref:food></food>-----------商品详情页面组件作为子组件引入。
  
  import shopcart from 'components/shopcart/shopcart';
  import cartcontrol from 'components/cartcontrol/cartcontrol';
  import food from 'components/food/food';
components: {
 shopcart,
 cartcontrol,
 food
},

    selectFood(food, event) {
        if (!event._constructed) {
          return;
        }
        this.selectedFood = food;
        this.$refs.food.show();---------父组件调用子组件的方法show()
      },
 


子页面:详情页面
<div v-show="showFlag" class="food" transition="move" v-el:food>----------增加了transition="move"页面切换的过渡效果
</div>


  .food
    position: fixed
    left: 0
    top: 0
    bottom: 48px
    z-index: 30
    width: 100%
    background: #fff
    &.move-transition
      transition: all 0.2s linear-----------------过渡效果
      transform: translate3d(0, 0, 0)-------------最终位置
    &.move-enter, &.move-leave
      transform: translate3d(100%, 0, 0)----------进入离开的位置
.image-header
 position: relative
 width: 100%
 height: 0----------------------设置height:0
 padding-top: 100%-------------->padding-top值等于width的宽度值。占据了一个宽高相同的区域,留给img加载展示用
 img
position: absolute
top: 0
left: 0
width: 100%
height: 100%
 
 show() {--------------------------子组件里面的方法
        this.showFlag = true;
        this.selectType = ALL;
        this.onlyContent = true;
        this.$nextTick(() => {
          if (!this.scroll) {
            this.scroll = new BScroll(this.$els.food, {
              click: true
            });
          } else {
            this.scroll.refresh();
          }
        });
      },
 


最新价格/旧的价格:  
<div class="price">
  <span class="now">¥{{food.price}}</span><span class="old" v-show="food.oldPrice">¥{{food.oldPrice}}</span>
</div>
 
.price
        font-weight: 700
        line-height: 24px
        .now
          margin-right: 8px
          font-size: 14px
          color: rgb(240, 20, 20)
        .old
          text-decoration: line-through------------>横线中间穿过,旧的价格
          font-size: 10px
          color: rgb(147, 153, 159)
 
 
详情页面内容超过视窗的高度时,引用BetterScroll,可以滚动内容,但是不会出现滚动条:
    1)BetterScroll绑定在外层div
    2)内层div的内容超出外层div的高度时,内层div可以进行滚动操作
 
<div v-show="showFlag" class="food" transition="move" v-el:food>
       <div class="food-content"></div>
</div>

import BScroll from 'better-scroll';
 
show() {
        this.showFlag = true;
        this.selectType = ALL;----------created时进行初始化设置
        this.onlyContent = true;--------created时进行初始化设置
        this.$nextTick(() => {--------------------------只有$nextTick才能够保证dom时渲染的,高度才能被计算过
          if (!this.scroll) {
            this.scroll = new BScroll(this.$els.food, {-------传入dom
              click: true-------------------------------------里面有些地方是可以被点击的,所以设置为click:true
            });
          } else {
            this.scroll.refresh();-----------------------重新做一次计算
          }
        });
      },
 


<div class="cartcontrol-wrapper">------------增加减少数量的组件
  <cartcontrol :food="food"></cartcontrol>
</div>
<div @click.stop.prevent="addFirst" class="buy" v-show="!food.count || food.count===0" transition="fade">加入购物车</div>-----------没有选数量的时候,出现“加入购物车”按钮  
----------------------------->@click.stop.prevent阻止点击穿透冒泡
      .cartcontrol-wrapper
        position: absolute
        right: 12px
        bottom: 12px
      .buy
        position: absolute
        right: 18px
        bottom: 18px
        z-index: 10------------------用来覆盖cartcontrol-wrapper组件的,所以设置z-index:10
        height: 24px
        line-height: 24px
        padding: 0 12px
        box-sizing: border-box
        border-radius: 12px
        font-size: 10px
        color: #fff
        background: rgb(0, 160, 220)
&.fade-transition--------------------加上transition过渡效果,同时解决了cartcontrol-wrapper组件的问题
          transition: all 0.2s
          opacity: 1
        &.fade-enter, &.fade-leave
          opacity: 0


addFirst(event) {
if (!event._constructed) {----------防止pc多次点击。better scroll传入的event有_constructed属性,屏蔽掉浏览器的默认操作即可
 return;
}
this.$dispatch('cart.add', event.target);
Vue.set(this.food, 'count', 1);
 },




 
<p class="text">
<span :class="{'icon-thumb_up':rating.rateType===0,'icon-thumb_down':rating.rateType===1}"></span>{{rating.text}}------------->:class=“{}”一个对象,写入多个属性值来判断用哪个class
</p>  
 



<div class="user">
<span class="name">{{rating.username}}</span>
<img class="avatar" width="12" height="12" :src="rating.avatar">
</div>

.user
position: absolute
right: 0
top: 16px
line-height: 12px
font-size: 0------------------父元素的font-size: 0,消除子元素之间(inline-block  图片与文字之间)默认存在的空白间隙
.name
 display: inline-block
 margin-right: 6px
 vertical-align: top---------与img的top对齐
 font-size: 10px
 color: rgb(147, 153, 159)
.avatar
 border-radius: 50%
 
 
'ratingtype.select'(type) {--------------改变选择评价按钮选项时,需要重新生成dom,刷新BetterScroll
        this.selectType = type;
        this.$nextTick(() => {----------------更新dom
          this.scroll.refresh();--------------重新计算BetterScroll
        });
      },  
 
 
 

preloader------------loader之前处理

include---只对该目录下文件检查
exclude---排除该目录下的文件          
              


<router-view :seller="seller" keep-alive></router-view>-------------seller是异步获取到的。

  export default {
    data() {
      return {
        seller: {
          id: (() => {
            let queryParam = urlParse();
            return queryParam.id;
          })()
        }
      };
    },
    created() {
      this.$http.get('/api/seller?id=' + this.seller.id).then((response) => {
        response = response.body;
        if (response.errno === ERR_OK) {
          this.seller = Object.assign({}, this.seller, response.data);
        }
      });
    },
    components: {
      'v-header': header
    }
  };              
              
              
              
    <div class="seller" v-el:seller>
        <div class="pic-wrapper" v-el:pic-wrapper>
          <ul class="pic-list" v-el:pic-list>
            <li class="pic-item" v-for="pic in seller.pics">
              <img :src="pic" width="120" height="90">
            </li>
          </ul>
        </div>
    </div>


    import BScroll from 'better-scroll';    
              
                        
    watch: {
      'seller'() {------------由于是异步获取数据的,需要监测数据的变化,重新计算better-scroll高度和宽度值
        this._initScroll();
        this._initPics();
      }
    },
    ready() {
      this._initScroll();
      this._initPics();
    },          
              
          
  _initScroll() {
    if (!this.scroll) {
      this.scroll = new BScroll(this.$els.seller, {
        click: true
      });
    } else {
      this.scroll.refresh();
    }
  },
  _initPics() {
    if (this.seller.pics) {
      let picWidth = 120;
      let margin = 6;
      let width = (picWidth + margin) * this.seller.pics.length - margin;
      this.$els.picList.style.width = width + 'px';------------计算图片区域的宽度,并且赋值给该div
      this.$nextTick(() => {
        if (!this.picScroll) {
          this.picScroll = new BScroll(this.$els.picWrapper, {
            scrollX: true,-------------------------横向滚动
            eventPassthrough: 'vertical'-----------滚动该图片区域的时候,外层不进行竖向滚动
          });
        } else {
          this.picScroll.refresh();
        }
      });
    }
  }          
          
              
              
    data() {
      return {
        seller: {
          id: (() => {------------------------seller有一个id属性
            let queryParam = urlParse();
            return queryParam.id;
          })()
        }
      };
    },
    created() {
      this.$http.get('/api/seller?id=' + this.seller.id).then((response) => {
        response = response.body;
        if (response.errno === ERR_OK) {
          this.seller = Object.assign({}, this.seller, response.data);---------保留id属性,扩展seller的其他属性
        }
      });
    },          

 
 
 
 

E:\nodeWork\v0hivb\prod.server.js:
    var express = require('express');-----------------启动一个express服务
    var config = require('./config/index');

    var port = process.env.PORT || config.build.port;

    var app = express();

    var router = express.Router();

    router.get('/', function (req, res, next) {
        req.url = '/index.html';
        next();
    });    
              
              
    var appData = require('./data.json');------------相对路径变化,因为所在目录不一样了          
              
              
              
E:\nodeWork\v0hivb\config\index.js:          
    productionSourceMap: false,-----------------false:打包生成的文件中不含sourcemap文件了
    cssSourceMap: false    
              

vue2.0中过渡效果的设置:
      <transition name="fades" >  </transition>              
                  
      /*动画*/
      .fades-enter-active,
      .fades-leave-active {
        transition: all .2s linear;------------设置transition效果
        transform: translate3D(0, 0, 0);
      }

      .fades-enter,
      .fades-leave-active {-------------------leave-active而不是leave
        transform: translate3D(100%, 0, 0);
      }              
              
              
vue2.0中transition触发的函数,用法区别:              
    <transition name="drop" @before-enter="beforeDrop" @enter="dropping" @after-enter="afterDrop">  </transition>                  
              
              
    当只用 JavaScript 过渡的时候,在 enter 和 leave 中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。          
              
              
    dropping(el, done) {
          /* eslint-disable no-unused-vars */
          let rf = el.offsetHeight;
          this.$nextTick(() => {
            el.style.webkitTransform = 'translate3d(0,0,0)';
            el.style.transform = 'translate3d(0,0,0)';
            let inner = el.getElementsByClassName('inner-hook')[0];
            inner.style.webkitTransform = 'translate3d(0,0,0)';
            inner.style.transform = 'translate3d(0,0,0)';
            el.addEventListener('transitionend', done);------------done进行回调
          });
        },          

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/zgpeterliu/article/details/81031787