心想着虽然自己不搞前端,但是一般的前端代码自己总得看得懂吧,那国内目前比较火的前端框架,那肯定是vue了,就花一天时间来学习一下吧,就当入个门,至少以后看到代码至少懂一些基础的东西。
坑还是比较多的,安装了很久,各种问题,参考这个博客,少走弯路:https://blog.csdn.net/qq_41340666/article/details/124168806
目录参考:
首先通过new Vue()来创建Vue实例,然后构造函数接收一个对象,对象中有一些属性:
el:是element的缩写,通过id选中要渲染的页面元素,本例中是一个div
data:数据,数据是一个对象,里面有很多属性,都可以渲染到视图中
name:这里我们指定了一个name属性
页面中的h2元素中,我们通过{{name)}的方式,来渲染刚刚定义的name属性。
Vue基础
{{ message }}
{{rawHtml}}
{{num+10}}
{{flag?"孙猴子":"傻猴子"}}
每个Vue实例在被创建时都要经过一系列的初始化过程︰
创建实例,装载模板,渲染模板等等。Vue为生命周期中的每个状态都设置了钩子函数(监听函数)。
每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。
例如: created代表在vue实例创建后;
我们可以在Vue中定义一个created函数,代表这个时期的构造函数;
Title
{{name}} xxx非常美丽!
{{num}} 位其着迷!
模拟实际渲染数据:this 我们可以看下在vue内部的this变量是谁,我们在created的时候,打印this
Title
{{name}} xxx非常美丽!
{{num}} 位其着迷!
总结: this就是当前的Vue实例,在Vue对象内部,必须使用this才能访问到Vue中定义的data内属性、方法等。
什么是指令?
指令(Directives)是带有 v-前缀的特殊属性。
例如我们在入门案例中的v-model,代表双向绑定。
格式:{{表达式}}
说明;
示例
HTML:
JS:
var app =new vue({
el:"#app",
data:{
name:"Jack""
}
})
使用0方式在网速较慢时会出现问题。在数据未加载完成时,页面会显示出原始的
加载完毕后才显示正确数据,我们称为插值闪烁。
我们将网速调慢一些,然后试试看刚才的案例:发现刷新页面有延迟
使用v-text
和v-html
指令来替代{{}}说明:
v-text
∶将数据输出到元素内部,如果输出的数据有代码,会作为普通文本输出
v-html
:将数据输出到元素内部,如果输出的数据有HTML代码,会被渲染
刚才的v-text和v-html可以看做是单向绑定,数据影响了视图渲染,但是反过来就不行。
接下来学习的v-model是双向绑定,视图(view)和模型(Model)之间会互相影响。
既然是双向绑定,一定是在视图中可以修改数据,这样就限定了视图的元素类型。
目前v-model的可使用元素有:input、select、textarea、checkbox、radio、components(Vue中的自定义组件)
v-on指令用于给页面元素绑定事件。
语法:v-on:事件名="js片段或函数名"
简写语法:例如v-on:click='add'
可以简写为@click='add'
{counter}} -->
{{ message }}
-
{{item}}
在事件处理程序中调用event.preventDefault()或event.stopPropagation())是非常常见的需求。
尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理DOM事件细节。
为了解决这个问题,Vue.js 为v-on提供了事件修饰符。
之前提过,修饰符是由点开头的指令后缀来表示的
遍历数据渲染页面是非常常用的需求,Vue中通过v-for指令来实现。
语法:v-for="item in items ""
items:要遍历的数组,需要在vue的data中定义好。
item:迭代得到的数组元素的别名
列表渲染
-
{{ item.title }}
在遍历的过程中,如果我们需要知道数组角标,可以指定第二个参数:
语法:v-for=" (item, index) in items "
当Vue.js用v-for 正在更新已渲染过的元素列表时,它默认用"就地复用"策略。
如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
这个功能可以有效的提高渲染的效率。
但是要实现这个功能,你需要给Vue一些提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素
你
需要为每项提供一个唯一 key属性。理想的key值是每项都有的且唯一的id。
提升加载数据的速度
v-if,顾名思义,条件判断。当得到结果为true时,所在的元素才会被渲染。
语法:v-if”布尔表达式”
当v-if和v-for出现在一起时,v-for优先级更高。也就是说,会先遍历,再判断条件。
我是程哥哥
我不是程哥哥
真的是程哥哥呀
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
div>
<script src="node_modules/vue/dist/vue.js">script>
<script>
const app = new Vue({
el:"#app",//elemnet,vue 作用的标签
data:{
}
});
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style type="text/css">
div #box{
width:100px;
height: 100px;
color: darkgray;
}
.red{
background-color: red;
}
.blue{
background-color: blue;
}
style>
head>
<body>
<div id="app">
<button>红色button>
<button>蓝色button>
<div id="box" class="red">
我是盒子
我是盒子
div>
div>
<script src="node_modules/vue/dist/vue.js">script>
<script>
const app = new Vue({
el:"#app",//elemnet,vue 作用的标签
data:{
}
});
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style type="text/css">
div #box{
width:100px;
height: 100px;
color: darkgray;
}
.red{
background-color: red;
}
.blue{
background-color: blue;
}
style>
head>
<body>
<div id="app">
<button @click="color='red'">红色button>
<button @click="color='blue'">蓝色button>
<div id="box" class="{{color}}">
我是盒子
我是盒子
div>
div>
<script src="node_modules/vue/dist/vue.js">script>
<script>
const app = new Vue({
el:"#app",//elemnet,vue 作用的标签
data:{
color:"red",
}
});
script>
body>
html>
在插值表达式中使用js表达式是非常方便的,而且也经常被用到。
但是如果表达式的内容很长,就会显得不够优雅,而且后期维护起来也不方便
form表单输入值获取
<template>
<div class="hello">
<input type="text" v-model="username">
<p>{{username}}p>
<button @click="clickGetUserName">获取用户名button>
div>
template>
<script>
export default {
name: 'HelloWorld',
data(){
return {
username:""
}
},
methods:{
clickGetUserName(){
console.log(this.username);
}
}
}
script>
watch可以让我们监控一个值的变化,从而做出相应的反应。
在大型应用开发的时候,页面可以划分成很多部分。
往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航。
但是如果每个页面都独白开发,这无骚增加了我们开发的成本。
所以我们会把页面的不同部分拆分成独立的组件,然后在不同页面就可以共享这些组件,避免重复开发。
我们通过Vue的component方法来定义一个全局组件。
定义好的组件,可以任意复用多次:
一旦局部注册,就意味着即便以后你不再使用这个组件,它依然会随着Vue的加载而加载。
因此,对于一些并不频繁使用的组件,我们会采用局部注册。
我们先在外部定义一个对象,结构与创建组件时传递的第二个参数一致:
我是单文件组件
通常一个单页应用会以一棵嵌套的组件树的形式来组织:
各个组件之间以嵌套的关系组合在一起,那么这个时候不可避免的会有组件间通信的需求。
比如我们有一个子组件:
Vue.component("introduce",{
// 直接使用props接收到的属性来渲染页面
template:'{{title}}
',
props:[title] // 通过props来接收一个父组件传递的属性
})
这个子组件中要使用title属性渲染页面,但是自己并没有title属性
通过props来接收父组件属性,名为title
prop传递数据
{{title}}
age={{age}}
{{names}}
- {{item}}
子组件接收父组件的num属性
子组件定义点击按钮,点击后对num进行加或减操作
vue提供了一个内置的this.$emit函数,用来调用父组件绑定的函数
自定义事件传递数据
{{message}}
{{chengping}}
import axios from "axios"
import { config } from "process";
import querystring from "querystring"
const instance = axios.create({
//网络请求公共配置
timeout:5000
})
//拦截器最常用
//发送数据
instance.interceptors.request.use(
config=>{
if(config.methods==="post"){
config.data = querystring.stringify(config.data)
}
//config:包含网络请求的所有信息
return config;
},
error=>{
return Promise.reject(error)
}
)
//获取数据之前
instance.interceptors.response.use(
response=>{
return response.status === 200?Promise.resolve(response):Promise.reject(error);
},
error=>{
const { response } = error;
//错误的处理才是我们最应该关注的
errprHandle(response.status,response.info);
}
)
export default instance;
https://router.vuejs.org/zh/