VUE入门
页面基础组件参考文档;(3条消息) 一篇文章,Vue快速入门!!!_cV展示的学习园-CSDN博客
Axios异步通信
Axios简介
Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下:
- 从浏览器中创建XMLHttpRequests
- 从node.js创建http请求
- 支持Promise API[JS中链式编程]
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF(跨站请求伪造)
由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架。
由于jQuery操作Dom太频繁,所以少用
测试Axios
- 准备数据
{
"name": "cv战士",
"url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343",
"page": 1,
"isNonProfit": true,
"address": {
"street": "含光门",
"city": "陕西西安",
"country": "中国"
},
"links": [
{
"name": "bilibili",
"url": "https://bilibili.com"
},
{
"name": "cv战士",
"url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343"
},
{
"name": "百度",
"url": "https://www.baidu.com/"
}
]
}
- 测试代码
<!DOCTYPE html>
<html lang="en" xmlns:v-binf="http://www.w3.org/1999/xhtml" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--v-cloak 解决闪烁问题-->
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<div id="vue" v-cloak>
<div>地名:{{info.name}}</div>
<div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div>
<div>链接:<a v-bind:href="info.url">{{info.url}}</a> </div>
</div>
<!--引入js文件-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#vue",
//data:属性:vm
data(){
return{
info:{
name:null,
address:{
country:null,
city:null,
street:null
},
url:null
}
}
},
mounted(){//钩子函数
axios
.get('../data.json')
.then(response=>(this.info=response.data));
}
});
</script>
</body>
</html>
计算属性、内容分发
自定义事件
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--view层,模板-->
<div id="vue">
<todo>
<todo-title slot="todo-title" v-bind:title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems"
:item="item" :index="index" v-on:remove="removeItems(index)"></todo-items>
</todo>
</div>
<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
Vue.component('todo',{
template:'<div>\
<slot name="todo-title"></slot>\
<ul>\
<slot name="todo-items"></slot>\
</ul>\
</div>'
});
Vue.component('todo-title',{
props:['title'],
template:'<div>{{title}}</div>'
});
//这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来!
Vue.component("todo-items",{
props:["item","index"],
template:"<li>{{item}}---{{index}}<button @click='remove'>删除</button></li>",
methods: {
remove: function (index) {
this.$emit('remove',index);
}
}
});
var vm = new Vue({
el:"#vue",
data:{
title:"cvzhanshi study java",
todoItems:['test1','test2','test3']
},
methods: {
removeItems: function (index) {
this.todoItems.splice(index,1);
}
}
});
</script>
</body>
</html>
通过上诉代码我们可以发现一个问题,如果删除操作要在组件中完成,那么组件如何删除Vue实例中的数据?
例:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cl2ga6d-1624517862625)(Vue.assets/1624501228359.png)]
删除按钮是在组件中的,点击删除按钮删除对应的数据。
阅读Vue教程可知,此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 组件中使用this.$emit(‘自定义事件名’, 参数) ,而在视图层通过自定义事件绑定Vue中的删除操作的方法
splice()
方法是修改array的“万能方法”,他可以从指定的索引开始删除若干个元素,然后再从改位置添加若干个元素:
var arr = [ 'microsoft ', 'Apple ', 'Yahoo ', 'AOL', 'Excite ', 'oracle'];
//从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2,3,'6oogle ', 'Facebook ' );//返回删除的元素['Yahoo', 'AoL ', 'Excite']
arr; //[ 'Microsoft ', 'Apple ', 'Google', 'Facebook ', 'oracle ' ]
//只删除,不添加:
arr.splice( 2,2); //[ 'Google ', 'Facebook ' ]
arr; //[ 'Microsoft ', ' Apple ', 'oracle ']
//只添加,不删除:
arr.splice(2,0,y'6oogle ', 'Facebook ' );//返回[],因为没有删除任何元素
arr; // [ 'Microsbft ', 'Apple ' , 'Google ', 'Facebook ', 'oracle ' ]

Vue入门小结
核心:数据驱动,组件化
优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;
常用的属性:
- v-if
- v-else-if
- v-else
- v-for
- v-on绑定事件,简写@
- v-model数据双向绑定
- v-bind给组件绑定参数,简写:
组件化
- 组合组件slot插槽
- 组件内部绑定事件需要使用到this.$emit(“事件名”,参数);
- 计算属性的特色,缓存计算数据
遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含,比如Ajax之类的通信功能,为了解决通信问
题,我们需要使用Axios框架做异步通信;
node.js(环境)
- 检查node.js环境
C:\Users\XXXX>node -v
v16.11.1
C:\Users\XXXX>npm -v
8.0.0
- 淘宝镜像加速
# -g 就是全局安装
npm install cnpm -g
# 或使用如下语句解决npm速度慢的问题,但是每次install都需要(妈发)
npm install --registry=https://registry.npm.taobao.org
尽量不用淘宝的可能会打包失败
- 安装vue-cli
cnpm instal1 vue-cli-g
#测试是否安装成功#查看可以基于哪些模板创建vue应用程序,通常我们选择webpack
vue list
C:\Users.......\AppData\Roaming\npm\node_modules

第一个vue项目
1、创建一个vue项目一路选no
C:\Users\CengXingPeng\Desktop\vue>vue init webpack myvue
? Project name myvue //项目名字
? Project description A Vue.js project //一个vue项目
? Author newcxp //作者名
? Vue build standalone
? Install vue-router? No
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) no
vue-cli · Generated "myvue".
# Project initialization finished!
# ========================
To get started:
cd myvue
npm install (or if using yarn: yarn)
npm run dev
Documentation can be found at https://vuejs-templates.github.io/webpack
2、初始化vue项目
cd myvue
npm install (or if using yarn: yarn)
npm run dev
运行成功
PS C:\Users\....\Desktop\vue\myvue> npm run dev
> myvue@1.0.0 dev
> webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
(node:7752) [DEP0111] DeprecationWarning: Access to process.binding('http_parser') is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
13% building modules 25/29 modules 4 active ...ingPeng\Desktop\vue\myvue\src\App.vue{ parser: "babylon" } is deprecated; we now treat it as { parser: "babel" }.
95% emitting
DONE Compiled successfully in 3719ms 下午5:42:26
I Your application is running here: http://localhost:8080
修改端口号

安装WebPack
WebPack 是一款模块加载器兼打包工具,它能把各种资源,如JS、JSX、ES6、SASS、LESS图片等都作为模块来处理和使用
npm install webpack -g
npm install webpack-cli -g
测试安装是否成功
webpack -v
webpack-cli -v
-
配置
创建webpack.config.js
配置文件
- entry: 入口文件,指定WebPack 用哪个文件作为项目的入口
- output:输出,指定WebPack 把处理完成的文件放置到指定路径
- module:模块,用于处理各种类型的文件
- plugins:插件,如:热更新、代码重用等
- resolve:设置路径指向
- watch:监听,用于设置文件改动后直接打包
使用Webpack
1、创建文件用IEDA打开

2、创建一个名为modules的目录。用于放置JS模块等资源文件
3、在modules字下创建文件,如hello.js
用于编写JS相关代码
//暴露一个方法 sayhi
exports.sayhi=function (){
document.write("<h1>hello webpack</h1>")
}
4、在modules目录下创建一个main.js
的入口文件用于打包是设置entry属性
//暴露一个方法 sayhi
exports.sayhi=function (){
document.write("<h1>hello webpack</h1>")
5、在项目目录下创建webpack.config.js
配置文件使用webpack
命令打包
module.exports={
entry:"./modules/main.js",
output:{
filename:"./js/bundle.js"
},
mode: 'development'//设置开发环境
};
注意:webpack.config.js
文件中必须陪配置开发环境不然报错mode: 'development'
运行过程

vue vue-router
Vue Router是 Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:
- 嵌套的路由/视图表
- 模块化的。基于组件的路由配置
- 路由的参数、查询、通配符
- 基于Vue.js过渡系统的视图过渡效果
- 细粒度的导航控制
- 带有自动激活的CSS class的链接
- HTML5历史模式或hash 模式,在IE9中自动降级自定义的滚动条行为
安装
基于第一个vue-cli进行测试;先查看node_modules中是否存在vue-router
vue-router是一个插件包,所以我们还需要用npm/cnpm来进行安装。打开命令行工具进入项目目录输入
npm install vue-router --save-dev
如果在模块工程中使用它,必须通过Vue.use()明确地安装路由功能
import Vue from 'vue'
import VueRouter from 'vue-router'
//安装路由
Vue.use(VueRouter)
测试 参考文档(3条消息) 一篇文章,Vue快速入门!!!_cV展示的学习园-CSDN博客
Vue+elementUI
创建工程
注意命令行都要使用管理员模式运行
- 创建一个hello-vue工程
vue init webpack hello-vue
- 安装依赖
vue-router
、elementUI
、sass-loader
、和node-sass
# 进入项目工程
cd hello-vue
#安装 vur-router
npm install vue-router --saver-dev
# 安装elementUI
npm i element-ui -s
#安装依赖
npm install
#安装SASS加载器
cnpm install sass-loader node-sass --save-dev
#启动测试
npm run dev
Npm命令解释
npm install moduleName
:安装到模块的目录下npm install -g moduleName
:-g 的意思是将模块安装到全局、具体安装到那个磁盘的那个位置要看npm config prefix的位置npm install -save moduleName
: --save 的意思是将模块安装到项目目录下,并在package 文件的dependencies节点写入依赖,-S为该命令的缩写npm install -save-dev moduleName
: --save-dev的意思是将模块安装到项目目录下在 package 文件的devDependencies节点写入依赖,-D为该命令的缩写
-
创建视图字在views目录下创建一个名为login.vue的视图组件,其el-*的元素为ElementUI的组件
-
自动生成doc的网站文档化 (docsify.js.org)
引入 Element
你可以引入整个 Element,或是根据需要仅引入部分组件。我们先介绍如何引入完整的 Element。
完整引入
在 main.js 中写入以下内容:
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
Vue.use(ElementUI)
new Vue({
el: '#app',
render: h => h(App)
})
注意:运行报错

可能是sass版本过高需要回退版本


修改版本后从新npm install
#先卸载node-sass
npm uninstall node-sass
#再重装4.x版本的node-sass
npm install node-sass@4.14.1
如果node.js版为16+ [https://blog.csdn.net/sinat_38592878/article/details/110387262]:用dart-sass(sass)代替
多路由嵌套
嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成
- 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件
<template>
<h1>个人信息</h1>
</template>
<script>
export default {
name: "UserProfile"
}
</script>
<style scoped>
</style>
- 在用户列表组件在 views/user 目录下创建一个名为 List.vue 的视图组件
<template>
<h1>用户列表</h1>
</template>
<script>
export default {
name: "UserList"
}
</script>
<style scoped>
</style>
- 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件
<template>
<div>
<el-container>
<el-aside width="200px">
<el-menu :default-openeds="['1']">
<el-submenu index="1">
<template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
<el-menu-item-group>
<el-menu-item index="1-1">
<!--插入的地方-->
<router-link to="/user/profile">个人信息</router-link>
</el-menu-item>
<el-menu-item index="1-2">
<!--插入的地方-->
<router-link to="/user/list">用户列表</router-link>
</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="2">
<template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
<el-menu-item-group>
<el-menu-item index="2-1">分类管理</el-menu-item>
<el-menu-item index="2-2">内容列表</el-menu-item>
</el-menu-item-group>
</el-submenu>
</el-menu>
</el-aside>
<el-container>
<el-header style="text-align: right; font-size: 12px">
<el-dropdown>
<i class="el-icon-setting" style="margin-right: 15px"></i>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>个人信息</el-dropdown-item>
<el-dropdown-item>退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-header>
<el-main>
<!--在这里展示视图-->
<router-view />
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
export default {
name: "Main"
}
</script>
<style scoped lang="scss">
.el-header {
background-color: #B3C0D1;
color: #333;
line-height: 60px;
}
.el-aside {
color: #333;
}
</style>
- 添加了组件,去router修改配置文件
//导入vue
import Vue from 'vue';
import VueRouter from 'vue-router';
//导入组件
import Main from "../views/Main";
import Login from "../views/Login";
//导入子模块
import UserList from "../views/user/List";
import UserProfile from "../views/user/Profile";
//使用
Vue.use(VueRouter);
//导出
export default new VueRouter({
routes: [
{
//登录页
path: '/main',
component: Main,
// 写入子模块
children: [
{
path: '/user/profile',
component: UserProfile,
}, {
path: '/user/list',
component: UserList,
},
]
},
//首页
{
path: '/login',
component: Login
},
]
})
参数传递
第一种方式
页面设置
<el-menu-item index="1-1">
<!--插入的地方-->
<!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
<router-link :to="{ name:'UsePersonal',params:{id:1}}">个人信息</router-link>
</el-menu-item>
路由设置
{
path:"/user/usepersonal/:id",
name: "UsePersonal",
component:UsePersonal
}
页面渲染
<!-- 所有的内容都要写在div中 -->
<div>
<h1>用户信息</h1>
{{$route.params.id}}
</div>
第二种方式
页面设置(props属性设置为true)
<el-menu-item index="1-1">
<!--插入的地方-->
<!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
<router-link :to="{ name:'UsePersonal',params:{id:1},props:true}">个人信息</router-link>
</el-menu-item>
路由设置props: true,
{
path:"/user/usepersonal/:id",
props: true,
name: "UsePersonal",
component:UsePersonal
}
页面渲染 props:['id']
接收值
<template>
<!-- 所有的内容都要写在div中 -->
<div>
<h1>用户信息</h1>
{{id}}
</div>
</template>
<script>
export default {
props:['id'],
name: "UserPersonal"
},
重定向 redirect:"/main"
{
//重定向
path:"/gohome",
redirect:"/main"
},
路由模式和404
路由模式有两种
- hash:路径带#,如https://localhost/#/login
- history:路径不带#号,如https://localhost/login
mode:'history',
routes:[
{
path:'/login',
component:Login
},
404页面
- 创建一个NotFound.vue视图
<template>
<div>
<h1>404,你的页面走丢了</h1>
</div>
</template>
<script>
export default {
name: "NotFound"
}
</script>
<style scoped>
</style>
- 配置路由
import NotFound from '../views/NotFound'
{
path: '*',
component: NotFound
}
路由钩子
除了之前的钩子函数还存在两个钩子函数
beforeRouteEnter
:在进入路由前执行beforeRouteLeave
:在离开路由前执行
参数说明
- to:路由将要跳转的路径信息
- from:路径跳转前的路径信息
- next:路由的控制参数
- next() 跳入下一个页面
- next(’/path’) 改变路由的跳转方向,使其跳到另一个路由
- next(false) 返回原来的页面
- next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例
在组件中
<script>
export default {
name: "UserProfile",
beforeRouteEnter: (to, from, next) => {
console.log("准备进入个人信息页");
next();
},
beforeRouteLeave: (to, from, next) => {
console.log("准备离开个人信息页");
next();
}
}
</script>
在钩子函数中进行异步请求
- 安装axios
cnpm install --save vue-axios
- main.js引用 Axios
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)
- 准备数据
{
"name": "cv战士",
"url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343",
"page": 1,
"isNonProfit": true,
"address": {
"street": "含光门",
"city": "陕西西安",
"country": "中国"
},
"links": [
{
"name": "bilibili",
"url": "https://bilibili.com"
},
{
"name": "cv战士",
"url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343"
},
{
"name": "百度",
"url": "https://www.baidu.com/"
}
]
}
说明: 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下
- 在 beforeRouteEnter 中进行异步请求
<script>
export default {
name: "UserProfile",
beforeRouteEnter: (to, from, next) => {
console.log("准备进入个人信息页");
next(vm => {
//进入路由之前执行getData方法
vm.getData()
});
},
beforeRouteLeave: (to, from, next) => {
console.log("准备离开个人信息页");
next();
},
//axios
methods: {
getData: function () {
this.axios({
method: 'get',
url: 'http://localhost:8080/static/mock/data.json'
}).then(function (response) {
console.log(response)
})
}
}
}
</script>