Vue学习

基础知识

计算属性computed
具有缓存的作用,当你的属性计算没有任何改变的时候,你多次调用这个计算属性将只执行一次
计算属性中有getset方法,一般只使用get方法

**event:**在vue语法中,如果要给你个事件传入一个变量并且`event`对象也要传入,那么`event`就表示event对象

v-model双向绑定
当在input中用v-model绑定一个变量时,当input的value改变时,这个变量也将改变

v-on的修饰符
-stop:阻止事件冒泡
用法:@click.stop = 'clickBtn'
-prevent:阻止默认事件:比如a的自动跳转
用法:@click.prevent= 'clickBtn'
-enter:当按下回车键时才执行
用法:@click.enter= 'clickBtn'
-once:只触发一次:比如一个按钮单击多次,只有第一次单击执行
用法:@click.once= 'clickBtn'

v-for使用

  //当你只需要获取对象中的value时
  <li v-for = "item in object">{{item}}</li>
  //当你只需要获取对象中的value、key时
  <li v-for = "(value,key)in object">{{item,key}}</li>

vue虚拟DOM复用问题

计算属性

1.1 计算属性的本质

计算属性由get()、set()两个方法组成

1.2 计算属性和methods属性的区别

计算属性执行多次,只会执行一次,存在缓存

事件监听

1.1 v-on:click和语法糖语法 @click

1.2 如果监听事件的方法需要传入event对象和其他参数,event对象在传入时,可以写成$event

修饰符

  • .enter
  • .tirm
  • .stop
  • .once 等修饰符

条件判断

  • v-else
  • v-if
  • v.show
  • v-for 等

v-model双向绑定

1.1 当一个input绑定一个变量时,input的value的值会跟随变量的值而改变,反之同理

1.2 修饰符

+ lazy
+ number
+ trim  等

组件化开发

1.1什么叫组件化

组件化开发即是对某些可以进行复用的功能进行封装的标准化工作 

1.2数据的存放

  • 子组件不能直接访问父组件
  • 子组件中有自己的data,而且必须是个函数
    • 因为组件是可以复用的,当你是函数时,每次创建的数据都是新的对象,这样组件之间就不会产 生影响
  • 在标签内调用vue的方法或属性时,驼峰写法的名字将出现错误
    • 解决方案:可以把大写字母换成小写字母 在前面加个-
  • 在注册组件时,组件名不能包含大写字母

1.3父子组件之间的通信

  • 父传子使用props属性设置
    • 一般父传子props都是一个对象,这样在对象中可以规定传入的数据的类型、默认值等操作
      *当你要操作props中的变量时,最好在data:{}属性中在获取一下props中的变量,操作data{}中赋值的变量,不要直接操作props中的变量。
      props中的变量主要是获取父组件的数据,如果你在别的地方又操作props中的数据,那么就会变的非常的乱
  • props的常见参数规定
    Vue.component('myComponent', {
    props: {
      // 基础类型检测 (`null` 意思是任何类型都可以)
      propA: Number,
      // 多种类型
      propB: [String, Number],
      // 必传且是字符串
      propC: {
        type: String,
        required: true
      },
      // 数字,有默认值
      propD: {
        type: Number,
        default: 100
      },
      // 数组/对象的默认值应当由一个工厂函数返回
      propE: {
        type: Object,
        default: function () {
          return { message: 'hello' }
        }
      },
      // 自定义验证函数
      propF: {
        validator: function (value) {
          return value > 10
        }
      }
    }
    

})

+ 子传父使用$emlt发出事件给父组件
####1.3组件的语法糖写法
```javascript
const app =new Vue({
  el:'#app',  //vue监听对象
  components: {            //注册一个组件
    'cpn': {
        template:  //组件模板定义
    }
  }
})
//一个简单的组件就这样创建完成

父子组件之间直接通过对象访问方法

  • $children 父访问子 不常用
  • $refs 父访问子 常用
  • $parent 子访问父 基本不用这方法 影响可复用性
  • $root 直接访问根组件

插槽slot

当你想扩展你的组件的内容时,可以在组件模板中写入<slot></slot>标签
在使用模板的地方写入你想扩展的内容,就会直接写入slot标签中

具名插槽

当一个组件模板中存在多个插槽时,可以给插槽一个name属性用来识别在使用模板时操作的标签

编译作用域

<div id="app">
    <cpn v-show = "isShow"></cpn>   
</div>
<template id="my-template">
    <div>
        <span>你好</span>
    </div>
</template>

const app = new Vue({
    el:"#app",
    data: {
      isShow:true
    },
    components: {
      'cpn': {
        template: '#my-template',
        data () {
          return {
            isShow:false
          }
        }
      }
    }
  })
 //虽然Vue实例中和cpn组件中都有isShow,cpn组件使用时调用了isShow变量,由于cpn是在Vue模板app中写的,所以在查询isShow 的值得时候优先查找vue实例中的数据。
同理如果你在cpn的模板中调用isShow变量,那么就优先在cpn中查找数据
官方解释:父组件模板中的所有东西都会在父级作用域内编译,子组件模板中的所有东西都会在子级作用域中编译

作用域插槽的使用

当父组件替换插槽的标签,但是内容还是由子组件提供时,就叫做作用域插槽
比如:当你在父模块中多次使用子组件时,由于内容表示的格式都一样,当你想按照子组件的数据进行不同的效果渲染时,就可以在子模块的slot插槽标签上写一个属性用v-bind绑定子组件的数据。
绑定好后,在父模板上使用时,在组件标签上写上属性slot-scope = 'slot',之后就可以在父模块中通过slot.data(在子模板中v-bind绑定的名)


webpack

简单的说,webpack就是一个javascript静态资源模块打包工具。它依赖于node环境
浏览器在解析javascrip代码时,有很多东西都是不支持的,比如ES6语法less``sass这些css预处理器,commonJS、CMD、AMD这些模块化方案,当你使用webpack,它就可以帮你把这些代码解析成浏览器可解析的代码。在模块化开发中,可能模块与模块之间会进行很多次的调用,依赖关系会变得非常的复杂,webpack就可以帮你把这些依赖关系给处理好,作用不止于此......

webpack打包各种文件配置信息

在项目根目录下创建一个webpack.config.js文件,其中配置内容如下

const path = require('path')    //node中的核心模块,用于操作路径

//开始配置打包
module.exports = {
  entry: '.......'    //js入口模块路径
  output: {  //出口配置
    path:path.resolve(__dirname,' 出口根文件 ')  //出口文件的路径  ,需要绝对路径使用__dirname获取
    filename: ' 出口文件名 ',
    publicPath: './dist/'    //当图片打包完存放的位置
  }
  //打包css文件,需要css-loader包,只用于加载css文件
  //打包css文件,还需要一个style-loader包,用于实现效果
  //安装这两个包命令:npm i -save-dev style-loader css-loader
  //配置方式:
  //在js入口文件中使用require加载css文件后:
  module: { 
    rules:  [    //rules规则,就是进行打包的一些配置规则
      {
          test: /\.css$/  //正则表达式查找css文件
          use:[ 'style-loader','css-loader']  //使用css包
      },
      //配置图片打包信息
      {
          test:/\.(jpg|gif|png|)$/,    //匹配图片正则
          use:[
              {
                  loader:'url-loader',    //打包图片需要的包
                  
                  options: {
                      limit:100000,            //小于100000的图片可以打包
                      name:'img/[name].[hash:8].[ext]'    //为了方便找到相应的图片,给每个打包好的图片一个命名格式保存在publicPath指定的文件中
                      
                      //如果图片的大小超过了limit规定的大小那么需要在下载一个file-loader包
                  }
              },
          //ES6转ES5
          //先使用npm下载包:npm i -save-dev babel-loader@7 babel-core babel-preset-es2015
              {
                  test: /\.js$/,
                  exclude: /('node_modules'|'bower_components')/,
                  use:{
                      loader:'babel-loader',
                      options:{
                          presets:['es2015']    //转译成ES5
                      }
                  }
              }
          ]
      }
    ]
  }
}
//最后在命令行输入webpack就可开始打包文件

Vue打包配置

现在项目中使用npm下载vue
在入口文件中写入:

import Vue from 'vue'      //这里不需要写路径,webpack会直接进入node_modules查找
const app = new Vue({
    el:'#app',
})

由于vue在发布一个版本时会有两个版本:runtime-only 和 runtime-compiler
- runtime-only //不能有任何的template所以运行vue时会报错
- runtime-compiler //这个可以支持template
所以我们需要在webpack.config.js中配置vue,代码如下

    module.exports = {
        entry: '入口js文件',
        output: {    '出口文件选项'
            path: path.resolve(__dirname,'/dist/')    //路径
            filename: 'success.js'  //js文件名
        } ,
        module: {    //需要配置的包
            
        },
        //配置vue
        resolve: {
            alias: {
                'vue$':'vue/dist/vue.esm.js'    //这个路径就能找到runtime-compiler版本的vue文件,这样就配置成功
            }
        }
    }

.vue文件的配置

当需要打包.vue文件时,需要vue-loadervue-template-compiler两个包
配置代码:

module.exports = {
    entry: '入口js文件',
        output: {    '出口文件选项'
            path: path.resolve(__dirname,'/dist/')    //路径
            filename: 'success.js'  //js文件名
        } ,
      module : {
          test: /\.vue$/,
          use:['vue-loader']
      }
}

vue-loader:加载.vue文件

vue-template-compiler:解析.vue中的内容,渲染为render

小提示:由于vue13版本以上解析.vue文件时,还要下载别的插件才能运行,所以这里下载的是13.0.0版本

.Vue文件的作用

.vue文件中可以实现htmljavaScriptCss代码的分离编写,只需要在入口文件中加载即可,每个.vue文件相当于一个组件,组件与组件之间也可以实现相互加载,实现组件化开发,最后形成一个组件树,更好的维护、管理

webpack打包其他东西配置信息地址


插件plugin

插件就是对框架的一个功能扩展

webpack自带插件

1.BannerPlugin:给打包好的文件开头注册一个信息
配置代码
配置时,先使用require加载webpack

plugins:[
      new webpack.BannerPlugin('信息')
]

扩展插件

1.html-webpack-plugin

把index.html文件也打包到发布文件中
配置代码
配置时,先使用require加载html-webpack-plugin

plugins:[
      new HtmlWebpackPlugin({
          template:'index.html'    //打包的index.html文件模板
      })
]

2.uglifyjs-webpack-plugin

js文件压缩插件

配置代码
配置时,注意webpack和uglifyjs-webpack-plugin的版本问题
我这里版本是:webpack@3.6.0uglifyjs-webpack-plugin@1.1.1

plugins:[
      new uglifyjsPlugin()        //引入插件的名
]

3.webpack-dev-server本地环境搭建

webpack-dev-server是基于node.js的开发时环境。
对代码进行编译储存在内存中,实时更新网页类容。

配置代码
配置时,注意webpack和uglifyjs-webpack-plugin的版本问题
我这里版本是:webpack@3.6.0webpack-dev-server@2.9.1

devServer: {
    contentBase:'./dist',      //为哪一个文件夹提供本地服务,默认是根文件夹,这里是dist文件夹
    inline:true,      //是否进行实时更新网页
    port:'8080',      //监听端口号
}

4.webpack配置文件webpack.config.js进行配置分离

目标:把开发时配置信息和发布时配置信息分离
使用:webpack-merge:把文件进行合并

module.exports = webpackMerge(baseConfig,{      //baseConfig:基础的配置信息
    //开发时的配置信息
})

脚手架(vue CLI)

1.安装脚手架2(对应的webpack版本3)

`npm install -g @vue/cli`

注意:上面安装的是Vue CLI3的版本,如果需要想按照Vue CLI2的方式初始化项目时不可以的。

图片1.png

2.在命令行创建脚手架

vue init webpack my-project
创建选项解释:

图片2.png

创建的脚手架目录

图片3.png

vue 的 runtime-Complier 和 runtime-only的区别

1.runtime-only 比 runtime-Compiler更轻、更小,运行更快

2.1.runtime-Copmlier在解析template时:

template=>ast=>render=>vDom=>UI
把模板进入Vue先解析为ast,再通过render渲染为虚拟DOM树(vDOM)最后渲染为最终页面(UI)

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})

2.2runtime-only不需要template模板

render=>vDom=>UI
跳过了解析为ast的步骤

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  render: h => return h(App)          //h:是createElement的简写
})

虚拟DOM就是一个javascript对象,它模拟了DOM树,形成一个js对象树用来表示真实的DOM树,最后通过diff算法插入到真实的DOM树中

diff算法非常复杂,这个就简单记录下算法过程
1.通过js对象结构来表示真实的DOM树,然后通过这个树构建一个真实的DOM树,然后插入到文档中
2.当树的状态改变时,重新构建一个DOM数。新的树和旧的树进行比较,记录差异
3.最后把差异运用到DOM树中,视图就更新了
4.大大提高了渲染速度

注意我们在开发当中更多的用runtime-only版本


路由

普通路由(路由器)

当你路由连接到猫,就会分出多个网络接口或网络信号,当你手机或电脑连接路由的一个端口时,这时候路由就分配了一个内网IP给你,猫的是公网IP
在一个公网下的IP地址,一般为192.168.1.111
公网IP:就是我们常说的IP地址唯一标识。
路由映射表:当路由分配给你一个内网IP时,就会增加一个映射,用于当别人给你传递数据时,找到正确的你的电脑。
数据传递路径:先找到你的公网(猫的IP),在进入路由,通过路由的映射表,找到数据传递的目标IP地址。
[
内网IP :电脑的唯一标识(mac)
]

后端路由和后端渲染

后端渲染:网站开发人员既要写后端代码也要写前端代码,最后把渲染好的页面直接返回给客户端(浏览器)
后端路由:url和页面之间处理的映射关系

01-后端路由阶段.png

前端渲染:也就是前后端分离,后端只需要把数据接口准备好,放到服务器,前端通富哦ajax或其他技术,获取到数据接口,然后直接在页面上实时渲染。前端和后端就可以更好的合作

02-前端后端分离阶段.png

SPA(单一面富应用阶段)

整个网页中只有一套html+css+js(全部的资源),js里有很多个页面块(也就是组件)其他的页面需要路由请求然后通过js代码判断,来决定当前需要渲染什么,就不会再去请求服务器拿数据、资源,因为所有的数据、资源已经在js中

前端路由:由前端开发工程师决定路由的映射关系

03-SPA页面页面的阶段.png

vue-router(路由)插件

在src文件夹中创建一个router文件夹在里面创建一个js文件开始配置
配置代码:

import vueRouter from "vue-router"      //引入包
import Vuefrom "vue"

Vue.use('vueRouter')        //想要使用vue插件必须使用这个函数进行安装

const routers = []      //路由映射数组

const router = new vueRouter({
    router:router
})

export defalut router       //导出


//最后在Vue实例里面挂载
import Vue from 'vue'
import App from './App.vue'
import router from "./router/index"

Vue.config.productionTip = false

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

推荐阅读更多精彩内容

  • vue学习笔记 安装 Vue 提供一个官方命令行工具,可用于快速搭建大型单页应用。只需几分钟即可创建并启动一个带热...
    EL_PSY_CONGROO阅读 1,059评论 0 5
  • [TOC] Vue 学习笔记 Vue 源码解析 - 主线流程 Vue 源码解析 - 模板编译 Vue 源码解析 -...
    Whyn阅读 620评论 0 1
  • 序言:乱七八糟一锅粥! 基于Vue.js 教程、介绍— Vue.js 心得: 在vue中,推荐始终使用 kebab...
    苦苦修行阅读 651评论 0 1
  • 构造器 每一个Vue.js的应用都是通过够构造函数Vue创建的一个Vue的根实例。例如: varvm =newVu...
    枫叶笛花阅读 443评论 0 0
  • Vue官方文档以下内容作为本人日常学习使用,不作为参考 一、Vue环境搭建以及vue-cli的使用 Vue多页面应...
    好一只帅卤蛋阅读 746评论 0 1