文章目录
- Vue 基础知识
-
- 一 Vue介绍
-
- 1.1 什么是Vue?
- 1.2 安装方式
- 1.3 声明式渲染
- 二 Vue实例
-
- 2.1 创建Vue
- 2.2 生命周期
-
- 2.2.1 图解
- 2.2.2 重点理解
- 2.2.3 上手实验一下
- 2.3 Vue项目结构
- 2.4 数据区域
- 三 模板语法
-
- 3.1 插值
-
- 3.1.1 文本
- 3.1.2 Html
- 3.1.3 Attribute
- 3.1.4 绑定 HTML Class
- 3.2 指令
-
- 3.2.1 v-if
- 3.2.2 v-on
- 3.2.3 v-for
- 3.2.4 v-show
- 3.2.5 v-model
- 四 计算属性与侦听器
-
- 4.1 计算属性
- 4.2 侦听属性
- 4.3 过滤器
- 五 AXIOS
-
- 5.1 特性
- 5.2 使用
- 5.3 案例
- 5.4 拦截器
Vue 基础知识 前言:本人之前是用的Angualr+NG-ZORRO 开发的前端框架,所以与Vue框架有相同之处
一 Vue介绍 1.1 什么是Vue?
Vue (读音 vju?,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
1.2 安装方式
- html
src="http://img.readke.com/220703/1TG12205-0.jpg">
- npm
npm install vue
#安装webpack
npm install -g webpack
# 安装脚手架
npm install vue-cli -g
# 初始化一个项目
vue init webpack myproject
1.3 声明式渲染
- DOM状态只是数据状态的一个映射
- 所有的逻辑尽可能在状态的层面去进行
- 当状态改变了,view会被框架自动更新到合理的状态
- 命令式:需要以具体代码表达在哪里做什么?它是如何实现的
- 声明式:只需要声明在哪里需要做什么?不需要关心具体怎么实现的
var vm = new Vue({
// 选项
})
- 当创建一个 Vue 实例时,你可以传入一个选项对象。这篇教程主要描述的就是如何使用这些选项来创建你想要的行为。
- 虽然没有完全遵循 MVVM 模型,但是
Vue
的设计也受到了它的启发。因此在文档中经常会使用vm
(ViewModel
的缩写) 这个变量名表示Vue
实例。 - 我们可以理解他是一个对象,一个对象会有他的生命周期。
2.2.1 图解 【VUE|官网学习Vue(一)Vue基础篇】
文章图片
- 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。(由生走向死亡)
文章图片
文章图片
文章图片
文章图片
文章图片
2.2.2 重点理解
Vue
每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建、数据初始化、挂载、更新、销毁,这就是一个组件所谓的生命周期。- 我们可能用的最多的钩子函数:
created
,mounted
。 - created:在模板渲染成
html
前调用,即通常初始化某些属性值,然后再渲染成视图。 - mounted:在模板渲染成
html
后调用,通常是初始化页面完成后,再对html
的dom
节点进行一些需要的操作。 - 一般
creadted
钩子函数主要是用来初始化数据。 - 一般
mounted
钩子函数是用来向后端发起请求拿到数据以后做一些业务处理。 - 注意这里不要与计算属性搞混了,
computed:{}
计算属性,什么是计算属性呢,我个人理解就是对数据进行一定的操作,可以包含逻辑处理操作,对计算属性中的数据进行监控。
- 创建一个Vue项目
vue init webpack MyVue-Object
- 修改Vue
//模板
生命周期
>
export default {
// 组件名,方便其他地方引入
name: 'HelloWorld',
// 数据区
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
beforeCreate: function () {
console.log('调用了beforeCreat钩子函数')
},
created: function () {
console.log('调用了created钩子函数')
},
beforeMount: function () {
console.log('调用了beforeMount钩子函数')
},
mounted: function () {
console.log('调用了mounted钩子函数')
}
}
- 观察结果
文章图片
2.3 Vue项目结构
- 编辑器:
VsCode2021
- 结构
文章图片
项目简介
基于 vue.js 的前端开发环境,用于前后端分离后的单页应用开发,可以在开发时使用 ES Next、scss 等最新语言特性。项目包含:基础库: vue.js、vue-router、vuex、whatwg-fetch
编译/打包工具:webpack、babel、node-sass
单元测试工具:karma、mocha、sinon-chai
本地服务器:express
目录结构├── README.md项目介绍├── index.html入口页面├── build构建脚本目录│├── build-server.js运行本地构建服务器,可以访问构建后的页面│├── build.js生产环境构建脚本│├── dev-client.js开发服务器热重载脚本,主要用来实现开发阶段的页面自动刷新│├── dev-server.js运行本地开发服务器│├── utils.js构建相关工具方法│├── webpack.base.conf.jswabpack基础配置│├── webpack.dev.conf.jswabpack开发环境配置│└── webpack.prod.conf.jswabpack生产环境配置├── config项目配置│├── dev.env.js开发环境变量│├── index.js项目配置文件│├── prod.env.js生产环境变量│└── test.env.js测试环境变量├── mockmock数据目录│└── hello.js├── package.jsonnpm包配置文件,里面定义了项目的npm脚本,依赖包等信息├── src源码目录 │├── main.js入口js文件│├── app.vue根组件│├── components公共组件目录││└── title.vue│├── assets资源目录,这里的资源会被wabpack构建││└── images││└── logo.png│├── routes前端路由││└── index.js│├── store应用级数据(state)││└── index.js│└── views页面目录│├── hello.vue│└── notfound.vue├── static纯静态资源,不会被wabpack构建。└── test测试文件目录(unit&e2e)└── unit单元测试├── index.js入口脚本├── karma.conf.jskarma配置文件└── specs单测case目录└── Hello.spec.js
- 如果作为开发人员,我们只需关注下面的模块信息
文章图片
2.4 数据区域
- 当一个 Vue 实例被创建时,它将
data
对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生响应,即匹配更新为新的值。
//模板
生命周期{{msg}}
>
export default {
// 组件名,方便其他地方引入
name: 'HelloWorld',
// 数据区
data () {
return {
msg: '欢迎来到Vue'
}
},
beforeCreate: function () {
console.log('调用了beforeCreat钩子函数')
},
created: function () {
console.log('调用了created钩子函数')
},
beforeMount: function () {
console.log('调用了beforeMount钩子函数')
},
mounted: function () {
console.log('调用了mounted钩子函数')
}
}
三 模板语法
Vue.js
使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层Vue
实例的数据。所有Vue.js
的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。3.1 插值
3.1.1 文本
- 格式:{{值}}
- 数据绑定最常见的形式就是使用Mustache语法 (双大括号) 的文本插值。
- 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。
Document - 锐客网
{{msg}}
3.1.2 Html
- 双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用
v-html
指令
Document - 锐客网 src="http://img.readke.com/220703/1TG1MW-10.jpg">
>
//创建Vue实例
const vm = new Vue({
// 绑定Dom元素,元素选择器
el: '#app',
data: {
msg: " 我是你"
}
})
3.1.3 Attribute
- Mustache 语法不能作用在 HTML attribute 上,遇到这种情况应该使用
v-bind
指令
...... ...
Document - 锐客网
3.1.4 绑定 HTML Class
data: {
isActive: true,
hasError: false
}
3.2 指令
指令 (Directives) 是带有
v-
前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for
是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。3.2.1 v-if
//模板
按钮
Oh no
3.2.2 v-on
- 在事件处理程序中调用
event.preventDefault()
或event.stopPropagation()
是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。
为了解决这个问题,Vue.js 为v-on
提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。
......
...... ...
Document - 锐客网
3.2.3 v-for
- 我们可以用
v-for
指令基于一个数组来渲染一个列表。v-for
指令需要使用item in items
形式的特殊语法,其中items
是源数据数组,而item
则是被迭代的数组元素的别名。
-
{{ item.message }}
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
3.2.4 v-show
- 另一个用于根据条件展示元素的选项是
v-show
指令。 v-if
是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if
也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。- 相比之下,
v-show
就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。 - 一般来说,
v-if
有更高的切换开销,而v-show
有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用v-show
较好;如果在运行时条件很少改变,则使用v-if
较好。
Hello!
3.2.5 v-model
- 你可以用
v-model
指令在表单、
及
元素上创建双向数据绑定。
v-model
会忽略所有表单元素的value
、checked
、selected
attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的data
选项中声明初始值。简单来说,双向绑定数据。- 在默认情况下,
v-model
在每次input
事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加lazy
修饰符,从而转为在change
事件_之后_进行同步。 - 如果想自动将用户的输入值转为数值类型,可以给
v-model
添加number
修饰符。 - 如果要自动过滤用户输入的首尾空白字符,可以给
v-model
添加trim
修饰符。
- 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。
- 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。
Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
4.2 侦听属性
- Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用
watch
——特别是如果你之前使用过 AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的watch
回调。
Document - 锐客网 src="http://img.readke.com/220703/1TG1MW-10.jpg">
>
//创建Vue实例
const vm = new Vue({
// 绑定Dom元素,元素选择器
el: '#app',
data: {
username: ''
},
watch:{
// 输入值侦听器
username(newVlaue,OldVlaue){
console.log("执行了方法!!!",newVlaue,OldVlaue)
}
}})
- 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过
watch
选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。简单理解事件监听器。
{{ fullName }}var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
4.3 过滤器
- 过滤器(Filters)是vue为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方︰插值表达式>和v-bind 属性绑定。
- 过滤器应该被添加在JavaScript表达式的尾部,由管道符进行调用。
- 这个概念与Angualr中的管道类似
局部使用
{{ msg | capitalize }}
>
export default {
name: "HelloWorld",
props:['msg'],
data() {
return {};
},
filters: {
capitalize: function(value) {
window.console.log("rd: value", value);
if (!value) return "";
value = https://www.it610.com/article/value.toString();
return value.charAt(0).toUpperCase() + value.slice(1);
// 首字母大写
}
}
};
全局使用:在main.js中注册过滤器main.js
Vue.filter("upperCase", function(value) {
if (!value) return "";
value = https://www.it610.com/article/value.toString();
return value.toUpperCase();
// 小写转为大写
});
new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#app");
五 AXIOS
- 官网:http://www.axios-js.com/
- Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
使用 npm:
$ npm install axios
使用 cdn:
="https://unpkg.com/axios/dist/axios.min.js">
5.3 案例
// 为给定 ID 的 user 创建请求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// post请求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 并发请求
function getUserAccount() {
return axios.get('/user/12345');
}function getUserPermissions() {
return axios.get('/user/12345/permissions');
}axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 两个请求现在都执行完成
}));
5.4 拦截器
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
推荐阅读
- javascript|vue基础、插值操作、计算属性、ES6补充
- vue|vue,首页优化
- php|php vue rbac,Vue+ThinkPHP5.1 实现基于角色控制权限的前后端分离后台管理系统
- 每天几个面试题|token过期?页面如何实现无感刷新?
- web|CSS 3之鼠标特效
- 同一台电脑局部安装vue2和vue3
- uni-app|uni-app引入小程序自定义组件的混合开发
- spring|阿里巴巴内部纯享的这份SpringBoot+VUE全栈开发实战手册,绝了
- vue|响应式实现