知识点小计

什么是Vue

  1. 是一个轻量级的mvvm框架

  2. 数据驱动+组件化的前端开发

  3. guthubc超过25k+的star数,社区完善

mvvm框架

mvvm 框架主要包括三个部分:

  1. View:视图部分=> Dom
  2. Model:数据部分=>js对象逻辑
  3. ViewModel:链接视图和数据的中间件,视图和数据不能直接通讯,需要通过viewModel来进行通讯,viewModel要实现一个observer观察者,当数据发生变化,viewModel能够观察到这种变化,并通知对应的视图进行更新,而用户操作视图,也能通知数据进行改动,这就实现了数据双向绑定

mvvm 框架主要应用:

  • 针对具有复杂交互逻辑的前端应用:外卖 音乐 打车
  • 提供基础的架构抽象
  • 通过ajax数据持久化,保证用户体验
  • 通过局部刷新 大大改善体验 有提示app端 减少刷新页面,也就减少 js Dom 被重新解析的损耗

前端技术选型

  • 社区活跃度 完善程度
  • 对比框架优缺点
    1. vue更轻量
    2. vue更易上手 学习曲线平稳
    3. 吸取两家职场,借鉴了angular的指令和react的组件化

vue.js 的核心思想

数据驱动

  • 在普通情况下model和view 交互通过ajax 获取数据然后手动改变Dom
  • 使用vue 省去了手动操作dom的步骤 viewModel的 Directives指令对dom做了一层封装 数据发生变化 来发送指令 让view去修改对应的Dom 数据驱动Dom变化,Dom 是数据的一种自然映射
  • vue还会对视图做一些监听,当修改视图时,vue会监听到这些变化,并把改变的数据传给Model来进行同步

数据响应原理

数据Model改变驱动视图View自动更新

在深入了解

组件化

拓展HTML元素 封装可重用的代码

组件的设计原则

  1. 页面上每个独立的可视/可交互区域视为一个组件
  2. 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下 就近维护
  3. 页面不过是组件的容器,组件可以嵌套自由组合成任意界面

项目制作中小知识点笔记

路由切换高亮

  1. router 中切换默认的路由高亮 样式名字就行了
var router = new VueRouter({
  routes: [{
    path: '/',
    redirect: '/home'
  }],
  linkActiveClass: 'mui-active'
})

vue 跨域代理

在vue-cli 创建的工程目录中 cofing/index.js

  proxyTable: {
    '/star': {
      target: 'http://vue.studyit.io',//要被代理的域名
      changeOrigin: true,//至关重要的属性 值为true 时 才可以被代理
      pathRewrite: {
        '^/star': ''
      }
    }
  },

package.json 版本依赖知识

"vue": "^2.5.2" 中的^ 代表着最低版本为2.5.2 实际安装版本会更高

vue-cli 2.x版本如何mock 本地模拟数据

参考文章

  1. node中的express
npm i express -D
npm i vue-resource -S

webpack.dev.conf.js 文件中配置路由规则

//  增加express  */
const express = require('express')
const app = express()
var appData = require('../data.json') //加载本地数据文件
var seller = appData.seller;
var goods = appData.goods;
var ratings = appData.ratings;
var apiRoutes = express.Router()
app.use('/api', apiRoutes)

devServer中配置规则 使用 get

/*  增加express  */
    before(app) {
      app.get('/api/goods', (req, res) => {
          res.json({
            code: 0,
            data: goods
          })
        }),
        app.get('/api/seller', (req, res) => {
          res.json({
            code: 0,
            data: seller
          })
        }),
        app.get('/api/ratings', (req, res) => {
          res.json({
            code: 0,
            data: ratings
          })
        })
    }
    /*  增加路由规则 end */

webpack 配置SRC 路径

webpack.base.conf.js 中,在 alias属性中 配置 固定的键值 指向同一路径 减少路径错误

  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'components': path.resolve(__dirname, '../src/components')
    }
  },

手机1像素实现

手机1像素问题出现的原因是 手机物理显示和屏幕显示的区别 在高分辨率的手机上比较明显
解决思路 是通过伪类来实现
定义一个全局的伪类

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

在护理不同分辨率所遇到的缩放情况

@media(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5)
    .border-1px
        &::after
            -webkit-transform: scaleY(0.7)
            transform: scaleY(0.7)
@media(-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2)
    .border-1px
        &::after
            -webkit-transform: scaleY(0.5)
            transform: scaleY(0.5)

webpack-dev-server 使用localhost和本机IP地址都可以访问

在config - index.js 中修改 host 为: 0.0.0.0


module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},

    // Various Dev Server settings
    // host: 'localhost', // can be overwritten by process.env.HOST
    host: '0.0.0.0', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined

HTML 元素之间的空白无意义间隙 去除方法

  1. 为父元素添加样式 font-size:0px
  2. 标签和标签紧挨着没有空格 但是一般格式化代码会破坏掉
    • 类似于
    span class="bulletin-title"></span><span class="bulletin-text">{{seller.bulletin}}</span>
    

css 经典布局 sticky-footers

效果:如果页面内容不够长的时候,页脚块粘贴在视窗底部;如果内容足够长时,页脚块会被内容向下推送。著作权归原作者所有。

图片 纯色 背景虚化

使用 filter: blur(10px);属性完成
配合背景图效果不错
背景色模糊 暂时只知道 IOS 的方法为: backdrop-filter: bulr(10px);

抽离样式小组件时

组件内只负责组件自身的展示
应用时还需要在添加样式来进行规范

css 垂直居中

在li 中多行文字垂直居中 使用 display: table;可以达到效果

css 文字垂直居中 vertical-align: middle;

css 图片设置大小 建议在标签中也写上宽度

<img width="57px" :src="food.icon">之后在css 中一样设置样式

better-scroll 不能滚动的原因之一是 父盒子高度和子盒子一样

父盒子被子盒子撑开 自然就滚动不了了

更改DOM 或者获取DOM的属性 一定要注意要在DOM已经完全刷新之后调用

使用this.$nextTick回调 可以确保这一事件

  methods: {
    /***
     * 使用bcrcoll 传入
     * */
    _initScroll() {
      console.log(this.$refs.menuwrapper);
      this.menuScroll = new BScroll(this.$refs.menuwrapper);
      this.foodScroll = new BScroll(this.$refs.foodwrapper);
    }
  },
  created() {
    this.$http.get("/api/goods").then(res => {
      if (res.body.code === ERR_OK) {
        console.log("goods=======", res.body);
        this.goods = res.body.data;
        /**
         * 在created 钩子中 执行异步操作 获取不到dom 的真实高度所以直接运行得不到正确结果
         * 需要在 this.$nextTick 中做异步
         */
        this.$nextTick(() => {
          this._initScroll();
        });
      }
    });
  }, 

编程习惯 给标签加雷明 如只是用来给js 进行选择 没有实际意义 可需要在雷鸣后加 hook 例如 food-list-hook

盖住同级元素

给自身元素相对定位 然后使用 margin-方向:负值 来遮盖

    &.current {
      position: relative; //这里!
      font-weight: 700;
      margin-top: -1px;
      background: #fff;
      z-index: 10;

      .text {
        border-none();
      }
    }

给观测属性 直接添加不存在的属性 直接赋值是不行的 检测不到新增和删除的变化

trantion3D 会开启硬件加速 更加顺畅

vue 的动画效果必须在 v-show 和v-if 中才能生效!

.rotate-enter, .rotate-leave-to {
opacity: 0;
transform: rotate(270deg);
}

.rotate-enter-active, .rotate-leave-active {
transition: all 0.4s linear;
}

Vue.set 像对象中增加不存在的属性 使之成为被监控的对象可以得到他的变化

搭配计算属性 当在子组件中操作父组件的计算属性时,父组件的数据会发生变化就会发生关联 
<!-- 父组件 -->
  computed: {
    selectFoods() {
      let foods = [];
      this.goods.forEach(good => { //this.goods 被操作的父组件对象
        good.foods.forEach(food => {
          if (food.count) {
            foods.push(food);
          }
        });
      });
      console.log("foods", foods);
      return foods;
    }
  }
<!-- 子组件 -->
  methods: {
    addCrat() {
      if (!this.food.count) {
        return Vue.set(this.food, "count", 1);//Vue.set 设置属性
      }
      this.food.count += 1;
    },
  }

子组件之间互相通信

  1. 使用vuex
  2. 自己创建一个事件处理模块 来进行中转
  3. 使用已经封装好的vue-bus 来进行

eslink 意外的错误或者操作不符合规范但实际情况需要这么做的时候

使用 /* eslint-disable */ 来取消检查

css布局 当元素高度会发生变化不能确定时 定位或者其他操作

使用百分比 来进行操作

css 布局屏幕等宽图片 防止抖动布局

图片加载是异步过程,如果不设置高度 当图片加载完成会有一个撑开的过程
防止此现象可以使用 padding-top:100% 当padding为100%时 是根据元素宽度来计算的 所以可以得到一个正方形

  <div class="img-header">
    <img :src="food.image" alt>
  </div>
  .img-header {
    position: relative;
    width: 100%;
    height: 0;
    padding-top: 100%;

    img {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
  }

css 布局 多个行内元素并列

如span display-inline-block 的元素 多个并列 需在父元素上使用 font-size=0来解决 空隙

css布局 字体图标和文字对齐方式

字体图标和文字不能居中对齐时 给设置成 display:inline-block给父级设置 font-size:0

 .father {
    font-size: 0;
    .icon {
      display: inline-block;
      vertical-align: top;
      font-size: 24px;
      margin-right: 4px;
    }
    .text {
      display: inline-block;
      vertical-align: top;
      font-size: 12px;
      line-height: 24px;
    }
 }

组件 父子组件传值

子组件不应该直接修改 props中的对象或数组因为是通过引用传入的直接修改会改变原数据 可以通过赋值的方式 在data中定义本地数据

  data() {
    return {
      selfSelectType: this.selectType//props中的参数
    };
  },

vue 写法 v-show 绑定一个函数的返回值

v-show="needShow(rating.rateType,rating.text)"
可以更方便的去做一些判断

css 布局 不同机型的 宽高不同适配 需要使用@media

js 一段选择展示的代码 传入两个核心变量 然后根据比对结果返回值来控制是否显示

    needShow(type, text) {
      if (this.onlyContent && !text) {
        return false;
      }
      if (this.selectType === ALL) {
        return true;
      } else {
        return this.selectType === type;
      }
    }

css 布局 方式 手机端使用padding 布局

例如 页面上方是固定区域 不会改变 那么在总页面就使用padding 固定出这个高度 让活动区域高度固定

css 图片滚动

图片滚动需要在图片层包裹一个div 作为父层 因为没有父层的宽度是不能滚动的
white-space: nowrap; 不折行

vue 切换组件时保存上一个组件的状态 使用 keep-alive

keep-alive 组件使用keep-alive时 请求只会发送一次 组件信息会被缓存到内存当中
当再次打开时 会先去内存中寻找

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

推荐阅读更多精彩内容

  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 9,560评论 1 52
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,144评论 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,456评论 1 45
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,047评论 0 29
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,204评论 0 6