VUE
传统的html+css+js+jq
现在的vue+less+js+jq
less基于node.js,可以动态生成css文件,可以动态的修改页面样式
前端开发IDE
也可以用IDEA开发
第一个VUE程序
- 新建一个空的项目,idea安装vue插件 vue.js插件
- html中引入vue(cdn链接方式引入)
<!--view-->
<div id="app">
{{message}}
</div>
<script>
var vm = new Vue({
el: "#app",
//model:数据
data: {
message: "hello , Vue!"
}
});
</script>
理解mvvm model(数据层) view(试图层) model&view(数据双向绑定)
数据双向绑定,当数据变化时,页面不用刷新也会跟着变化
虚拟dom,不用再去操作页面的dom对象
vue中的7大对象
el: 页面元素 与元素选择器类似
data: 数据
vue基本语法
if判断
for循环
vue绑定事件
v-on
v-model
vue的组件
组件就是自定义标签
v-bind
将数据绑定到某个字段上
网络通信
<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
计算属性(vue特色)
computed
可以理解为mybatis里面的缓存,当请求的数据没有变化时,则会从缓存中拿数据,一旦数据产生变化,则重新更新数据
slot插槽
slot
用slot替换上面写死的元素标签
v-bind:可以简写成 :
vue核心:数据驱动 虚拟dom 、组件化compent
vue-cli脚手架(构建第一个vue工程)
与maven类似
打包并运行成功
访问 http://localhost:8080/
目录分析:
- build:打包工具目录
- config:配置目录 端口号也在此配置
- node_modules:类似于maven库的lib,依赖目录
- src:代码资源目录
- static:静态资源目录
webpack学习
静态模块打包器
浏览器现在还不支持 ECMAScript6 以上版本,如果我们开发是基于6以上版本开发的话,通过webpack可以将开发的代码版本降级到5以下
新建html文件,将打包好的js文件引入javascript中
引入成功
webpack --watch // 热部署功能,持续监听项目,如果目标文件有变化,则重新打包
vue-router 路由
在项目目录下安装路由,其实就是将vue-router的包导入依赖中
使用router路由步骤
1、配置路由 index.js,将组件导入到路由配置中,配置跳转组件的路径
import Vue from 'vue';
import VueRouter from "vue-router";
import Content from "../components/Content";
import Main from "../components/Main";
//装配路由
Vue.use(VueRouter);
//配置导出路由
export default new VueRouter({
routes: [
{
//路由路径
path:'/content',
name: 'content',
//跳转的组件
component: Content
},
{
//路由路径
path:'/main',
name: 'main',
//跳转的组件
component: Main
}
]
});
2、在main.js文件中配置使用路由
注:在main中导入的router是指配置好的router的配置文件/router/index.js
注:在/router/index.js中导入的router是指依赖中的router组件
import Vue from 'vue'
import App from './App'
import router from "./router" //自定扫描里面的路由配置,每个插件的默认配置文件习惯命名为index
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
3、在App.vue组件中使用路由跳转(App.vue是总的组件,里面包含各种小组件)
<template>
<div id="app">
<h1>VUE-ROUTER</h1>
<router-link to="/content">内容页</router-link> //请求路由
<router-link to="/main">首页</router-link>
<RouterView></RouterView> //经路由请求组件,跳转之后组件的显示位置
</div>
</template>
<script>
import Content from "./components/Content"; //导入组件
import Main from "./components/Main";
export default {
name: 'App',
comments: {
Content, //配置组件
Main
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
ElementUI
整合ElementUI,一个vue项目的创建流程
1、初始化一个vue项目 全选no
vue init webpack hello-vue
2、安装四个插件:vue-router、element-ui、sass-loader、node-sass
#安装vue-router
npm install vue-router --save-dev
#安装element-ui
npm i element-ui -S
#安装依赖
npm install
#安装sass-loader、node-sass
cnpm install sass-loader node-sass --save-dev
3、启动项目
npm run dev
加入element之后项目不同的地方:main.js
import Vue from 'vue'
import App from './App'
import router from "./router";
//引入element-ui及其css文件
import Element from "element-ui";
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false
//使用element
Vue.use(Element)
Vue.use(router)
new Vue({
el: '#app',
router,
render: h => h(App) //使用element 需要改成的配置
})
嵌套路由
配置嵌套路由
import Vue from "vue";
import VueRouter from "vue-router";
import Login from "../views/Login";
import Main from "../views/Main";
import Children from "../views/Children";
Vue.use(VueRouter)
export default new VueRouter({
routes: [
{
path: '/login',
component: Login
},
{
path: '/main',
component: Main,
children: [ //嵌套路由
{path: '',compent: Children}
]
}
]
})
参数传递和重定向
接收参数
路由的配置
export default new VueRouter({
routes: [
{
path: '/login',
component: Login
},
{
path: '/main/:id', //接收参数 :是绑定的意思
component: Main,
children: [
{path: '',compent: Children}
]
}
]
})
页面的配置
<!--取出路由中的参数信息-->
{{$route.params.id}}
<!--name:路由的配置路径或者name属性值,params:为键值对的参数信息-->
<router-link :to="{name:'/main',params:{id:1}}">首页</router-link>
<router-view></router-view>
props解耦
路由配置
export default new VueRouter({
routes: [
{
path: '/login',
component: Login
},
{
path: '/main/:id', //接收参数 :是绑定的意思
component: Main,
props: true,//解耦。可以将参数直接传递到组件中,组件使用props接收参数
children: [
{path: '',compent: Children}
]
}
]
})
组件的配置
<template>
<div>
<h1>我是主页</h1>
{{id}} //直接取出参数即可
</div>
</template>
<script>
export default {
props: ['id'], //使用props接收参数
name: "Main"
}
</script>
重定向
很简单就是在路由配置文件中增加一条重定向配置
export default new VueRouter({
routes: [
{
path: '/login',
component: Login
},
{
path: '/main/:id', //接收参数 :是绑定的意思
component: Main,
props: true,//解耦。可以将参数直接传递到组件中,组件使用props接收参数
children: [
{path: '',compent: Children}
]
},
{
path: '/gomain', ///重定向配置
redirect: '/mian'
}
]
})
404和路由钩子
404
import Vue from "vue";
import VueRouter from "vue-router";
import Login from "../views/Login";
import Main from "../views/Main";
import Children from "../views/Children";
import NotFound from "../views/NotFound";
Vue.use(VueRouter)
export default new VueRouter({
mode: 'history',
routes: [
{
path: '/login',
component: Login
},
{
path: '/main/:id', //接收参数 :是绑定的意思
component: Main,
props: true,//解耦。可以将参数直接传递到组件中,组件使用props接收参数
children: [
{path: '',compent: Children}
]
},
{
path: '/gomain',
redirect: '/mian'
},
{ //配置404页面,本质也是一个自己创建的404组件,当访问不存在的组件时都会经过这个路由
path: '*',
component: NotFound
}
]
})
钩子函数
对于组件的配置
export default {
props: ['id'],
name: "Main",
beforeRouteEnter: (to,from,next)=>{
console.log("进入路由之前")
next();
},
beforeRouteLeave:(to,from,next)=>{
console.log("进入路由之后")
next();
}
}
导入axios 依赖
npm install --save vue-axios
npm install --save axios
main.js配置axios
import Vue from 'vue'
import App from './App'
import router from "./router";
//引入element-ui及其css文件
import Element from "element-ui";
import 'element-ui/lib/theme-chalk/index.css'
//引入axios
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.config.productionTip = false
//使用element
Vue.use(Element)
//使用axios
Vue.use(VueAxios,axios)
Vue.use(router)
new Vue({
el: '#app',
router,
render: h => h(App) //使用element 需要改成的配置
})
路由钩子的实际使用
组件中使用路由钩子,可以在进入路由之前提前加载数据
<template>
<div>
<h1>我是主页</h1>
{{id}}
</div>
</template>
<script>
export default {
props: ['id'],
name: "Main",
beforeRouteEnter: (to,from,next)=>{
console.log("进入路由之前")
//加载数据
next(vm=>{
vm.getData();//进入路由之前获取数据
});
},
beforeRouteLeave:(to,from,next)=>{
console.log("进入路由之后")
next();
},
methods: {
getData: function () {
this.axios({
method: "get",
url: "https://localhost:8080/....",
}).then(function (response) {
console.log(response)
})
}
}
}
</script>