vue

Vue 的基本认识

 官网

1)英文官网:https://vuejs.org/

2)中文官网:https://cn.vuejs.org/

介绍描述

1)渐进式 JavaScript 框架

2)作者: 尤雨溪(一位华裔前 Google 工程师)

3)作用: 动态构建用户界面

 Vue 的特点

1)遵循 MVVM 模式

2)编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发

3)它本身只关注 UI, 可以轻松引入 vue 插件或其它第三方库开发项目

与其它前端 JS 框架的关联

1)借鉴 angular 的模板和数据绑定技术

2)借鉴 react 的组件化和虚拟 DOM 技术

 Vue 扩展插件

1)vue-cli: vue 脚手架

2)vue-resource(axios): ajax 请求

3)vue-router: 路由

4)vuex: 状态管理

5)vue-lazyload: 图片懒加载

6)vue-scroller: 页面滑动相关

7)mint-ui: 基于 vue 的 UI 组件库(移动端)

8)element-ui: 基于 vue 的 UI 组件库(PC 端)

9)它本身只关注 UI, 可以轻松引入 vue 插件或其它第三方库开发项目

Vue 的基本使用

编码

<div  id="app">

<input  type="text"  v-model="username">

<p>Hello,  {{username}}</p>

</div>

<script  type="text/javascript"  src="../js/vue.js"></script>

<script  type="text/javascript">

new  Vue({

el:  '#app',

data:  {

username:  'vue'

}

})

</script>

 模板语法

模板的理解

1)动态的 html 页面

2)包含了一些 JS 语法代码

a.双大括号表达式

b.指令(以 v-开头的自定义标签属性)

文本

    <span>Message:{{msg}}</span>

原始HTML

    <p>Using mustaches:{{rawHtml}}<p>

    <p>Using v-html directive:<span v-html="rawHtml"></span></p>

 双大括号表达式

1)语法: {{exp}}

2)功能: 向页面输出数据

3)可以调用对象的方法

表达式

    {{number + 1}}

    {{ok?'YES':'NO'}}

    {{message.split('').reverse().join('')}}

指令一: 强制数据绑定

1)功能: 指定变化的属性值

2)完整写法:

v-bind:xxx='yyy' //yyy 会作为表达式解析执行

3)简洁写法:

:xxx='yyy'

指令二: 绑定事件监听

1)功能: 绑定指定事件名的回调函数

2)完整写法:

v-on:keyup='xxx'

v-on:keyup='xxx(参数)' v-on:keyup.enter='xxx'

3)简洁写法:

@keyup='xxx' @keyup.enter='xxx'

计算属性和监视

 计算属性

1)在 computed 属性对象中定义计算属性的方法

2)在页面中使用{{方法名}}来显示计算的结果

监视属性

1)通过通过 vm 对象的$watch()或 watch 配置来监视指定的属性

2)当属性变化时, 回调函数自动调用, 在函数内部进行计算

 计算属性高级

1)通过 getter/setter 实现对属性数据的显示和监视

2)计算属性存在缓存, 多次读取只执行一次 getter 计算

1.5. class 与 style 绑定

理解

1)在应用界面中, 某个(些)元素的样式是变化的

2)class/style 绑定就是专门用来实现动态样式效果的技术

class 绑定

1):class='xxx'

2)表达式是字符串: 'classA'

3)表达式是对象: {classA:isA, classB: isB}

4)表达式是数组: ['classA', 'classB']

style 绑定

1):style="{ color: activeColor, fontSize: fontSize + 'px' }"

2)其中 activeColor/fontSize 是 data 属性

条件渲染

条件渲染指令

1)v-if 与 v-else

2)v-show

比较 v-if 与 v-show

3)如果需要频繁切换 v-show 较好

4)当条件不成立时, v-if 的所有子节点不会解析

列表渲染

列表显示指令

数组: v-for / index

对象: v-for / key

列表的更新显示

删除 item

替换 item

列表的高级处理

列表过滤

列表排序

事件处理

绑定监听:

1)v-on:xxx="fun"

2)@xxx="fun"

3)@xxx="fun(参数)"

4)默认事件形参: event

5)隐含属性对象: $event

事件修饰符

1).prevent : 阻止事件的默认行为 event.preventDefault()

2).stop : 停止事件冒泡 event.stopPropagation()

按键修饰符

1).keycode : 操作的是某个 keycode 值的键

2).keyName : 操作的某个按键名的键(少部分)

 表单输入绑定

使用 v-model 对表单数据自动收集

1)text/textarea

2)checkbox

3)radio

4)select

 vue 生命周期分析

1)初始化显示

*beforeCreate()

*created()

*beforeMount()

*mounted()

2)更新状态: this.xxx = value

*beforeUpdate()

*updated()

3)销毁 vue 实例: vm.$destory()

*beforeDestory()

*destoryed()

常用的生命周期方法

1)created()/mounted(): 发送 ajax 请求, 启动定时器等异步任务

2)beforeDestory(): 做收尾工作, 如: 清除定时器

过渡&动画

 vue 动画的理解

1)操作 css 的 trasition 或 animation

2)vue 会给目标元素添加/移除特定的 class

3)过渡的相关类名

xxx-enter-active: 指定显示的 transition

xxx-leave-active: 指定隐藏的 transition

xxx-enter/xxx-leave-to: 指定隐藏时的样式

 基本过渡动画的编码

1)在目标元素外包裹

2)定义 class 样式

指定过渡样式: transition

指定隐藏时的样式: opacity/其它

 过滤器

 理解过滤器

1)功能: 对要显示的数据进行特定格式化后再显示

2)注意: 并没有改变原本的数据, 可是产生新的对应的数据

 定义和使用过滤器

1)定义过滤器

Vue.filter(filterName, function(value[,arg1,arg2,...]){

// 进行一定的数据处理

return newValue

})

2)使用过滤器

<div>{{myData | filterName}}</div>

<div>{{myData | filterName(arg)}}</div>

内置指令与自定义指令

常用内置指令

1)v-text : 更新元素的 textContent

2)v-html : 更新元素的 innerHTML

3)v-if : 如果为 true, 当前标签才会输出到页面

4)v-else: 如果为 false, 当前标签才会输出到页面

5)v-show : 通过控制 display 样式来控制显示/隐藏

6)v-for : 遍历数组/对象

7)v-on : 绑定事件监听, 一般简写为@

8)v-bind : 强制绑定解析表达式, 可以省略 v-bind 简写为:

9)v-model : 双向数据绑定

10)ref : 指定唯一标识, vue 对象通过$refs 属性访问这个元素对象

11)v-cloak : 防止闪现, 与 css 配合: [v-cloak] { display: none }

1.13.2. 自定义指令

1)注册全局指令

Vue.directive('my-directive', function(el, binding){ el.innerHTML = binding.value.toupperCase()

})

// 注册一个全局自定义指令 `v-focus`

Vue.directive('focus', {

  // 当被绑定的元素插入到 DOM 中时……

  inserted: function (el) {

    // 聚焦元素

    el.focus()

  }

})

2)注册局部指令

directives : {

'my-directive' : {

bind (el, binding) {

el.innerHTML = binding.value.toupperCase()

}

}

}

3)使用指令

v-my-directive='xxx'

自定义插件

说明

1)Vue 插件是一个包含 install 方法的对象

2)通过 install 方法给 Vue 或 Vue 实例添加方法, 定义全局指令等

使用 vue-cli 创建模板项目

说明

vue-cli 是 vue 官方提供的脚手架工具

github:https://github.com/vuejs/vue-cli

作用: 从 https://github.com/vuejs-templates 下载模板项目

创建 vue 项目

vue -V 显示版本2时

npm install -g vue-cli

vue init webpack vue_demo

cd vue_demo

npm install

npm run dev

访问: http://localhost:8080/

vue -V 显示版本3时

npm install -g @vue/cli

vue create vue_demo

cd vue_demo

npm install

npm run dev

访问: http://localhost:8080/

模板项目的结构

|-- build : webpack 相关的配置文件夹(基本不需要修改)

|-- dev-server.js : 通过 express 启动后台服务器

|-- config: webpack 相关的配置文件夹(基本不需要修改)

|-- index.js: 指定的后台服务的端口号和静态资源文件夹

|-- node_modules

|-- src : 源码文件夹

|-- components: vue 组件及其相关资源文件夹

|-- App.vue: 应用根主组件

|-- main.js: 应用入口 js

|-- static: 静态资源文件夹

|-- .babelrc: babel 的配置文件

|-- .eslintignore: eslint 检查忽略的配置

|-- .eslintrc.js: eslint 检查的配置

|-- .gitignore: git 版本管制忽略的配置

|-- index.html: 主页面文件

|-- package.json: 应用包配置文件

|-- README.md: 应用描述说明的 readme 文件

 项目的打包与发布

打包:

npm run build

发布 1: 使用静态服务器工具包

npm install -g serve

serve dist

访问: http://localhost:5000

发布 2: 使用动态 web 服务器(tomcat)

修改配置: webpack.prod.conf.js

output: {

     publicPath: '/xxx/' //打包文件夹的名称

}

重新打包:

npm run build

修改 dist 文件夹为项目名称: xxx

将 xxx 拷贝到运行的 tomcat 的 webapps 目录下访问: http://localhost:8080/xxx

 ESLint

说明

ESLint 是一个代码规范检查工具

它定义了很多特定的规则, 一旦你的代码违背了某一规则, eslint 会作出非常有用的提示

官网: http://eslint.org/

基本已替代以前的 JSLint

ESLint 提供以下支持

ES

JSX

style 检查

自定义错误和提示

ESLint 提供以下几种校验

语法错误校验

不重要或丢失的标点符号,如分号

没法运行到的代码块

未被使用的参数提醒

确保样式的统一规则,如 sass 或者 less

检查变量的命名

规则的错误等级有三种

0:关闭规则。

1:打开规则,并且作为一个警告(信息打印黄色字体)

2:打开规则,并且作为一个错误(信息打印红色字体)

 相关配置文件

.eslintrc.js : 全局规则配置文件

'rules': {

     'no-new': 1

}

在 js/vue 文件中修改局部规则

/* eslint-disable no-new */

new Vue({

     el: 'body',

components: { App }

})

.eslintignore: 指令检查忽略的文件

*.js

*.vue

组件定义与使用

 vue 文件的组成(3 个部分)

模板页面

<template>

页面模板

</template>

JS 模块对象

<script>

     export default {

         data() {return {}},

         methods: {},

         computed: {},

         components: {}

}

</script>

样式

<style>

样式定义

</style>

基本使用

引入组件

映射成标签

使用组件标签

<template>

     <HelloWorld></HelloWorld>

     <hello-world></hello-world>

</template>

<script>

     import HelloWorld from './components/HelloWorld'

     export default {

         components: {

             HelloWorld

         }

     }

</script>

关于标签名与标签属性名书写问题

写法一:一模一样

写法二:大写变小写, 并用-连接

 组件间通信

组件间通信基本原则

不要在子组件中直接修改父组件的状态数据

数据在哪, 更新数据的行为(函数)就应该定义在哪

vue 组件间通信方式

props

vue 的自定义事件

消息订阅与发布(如: pubsub 库)

slot

vuex

组件间通信 1: props

使用组件标签时

<my-component name = 'tom' :age = '3' :set-name = 'setName'></my-component>

定义 MyComponent 时

在组件内声明所有的 props

方式一: 只指定名称

props: ['name', 'age', 'setName']

方式二: 指定名称和类型

props: {

     name: String, age: Number,

     setNmae: Function

}

方式三: 指定名称/类型/必要性/默认值

props: {

     name: {type: String, required: true, default:xxx},

}

 注意

此方式用于父组件向子组件传递数据

所有标签属性都会成为组件对象的属性, 模板页面可以直接引用

问题:

a.如果需要向非子后代传递数据必须多层逐层传递

b.兄弟组件间也不能直接 props 通信, 必须借助父组件才可以

 组件间通信 2: vue 自定义事件

绑定事件监听

// 方式一:通过 v-on 绑定

@delete_todo="deleteTodo"

// 方式二:通过 $on()

this.$refs.xxx.$on('delete_todo', function (todo) {

     this.deleteTodo(todo)

})

触发事件

// 触发事件(只能在父组件中接收)

this.$emit(eventName, data)

 注意:

此方式只用于子组件向父组件发送消息(数据)

问题: 隔代组件或兄弟组件间通信此种方式不合适

 组件间通信 3: 消息订阅与发布(PubSubJS 库)

 订阅消息

PubSub.subscribe('msg', function(msg, data){})

发布消息

PubSub.publish('msg', data)

注意

优点: 此方式可实现任意关系组件间通信(数据)

事件的 2 个重要操作(总结)

绑定事件监听 (订阅消息)

目标: 标签元素 <button>

事件名(类型): click/focus

回调函数: function(event){}

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

推荐阅读更多精彩内容

  • 基本用法 一、vuejs简介 是一个构建用户界面的框架 是一个轻量级的MVVM(Model-View-ViewMo...
    深度剖析JavaScript阅读 18,235评论 0 8
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,307评论 0 3
  • Vue是现在最流行的前端框架之一,而且相对于其他两个框架React和Angular来说也更加易学,而且它的作者是国...
    dinel阅读 4,941评论 0 9
  • Vue是现在最流行的前端框架之一,而且相对于其他两个框架React和Angular来说也更加易学,而且它的作者是国...
    乐百川阅读 3,443评论 0 9
  • vue 1、 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解 Vue使用了Musta...
    Aniugel阅读 9,544评论 3 21