Vue是一套用于构建用户界面的渐进式JavaScript框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用([SPA])提供驱动。(百度百科)
后端为主的MVC
基于AJAX带来的SPA时代单页面应用时代
前端为主的MV*时代
涌现大量的前端框架
前后端指责很清晰:前端工作在浏览器端,后段工作在服务端。
全端开发的复杂度可控
部署相对独立
Nodejs带来的全栈时代
随着Nodejs的兴起,JavaScript开始有能力运行在服务器端。
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
{{message}}
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
//Model:数据
data:{
message:"hello,vue!"
}
});
//可以通过console中,动态修改数据
//vm.message="xqh" 不用刷新可以直接在页面中得到反馈修改数据
script>
body>
html>
通过Vue绑定的数据,可以在浏览器中console直接动态修改,不用刷新页面
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
span>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
//Model:数据
data:{
message:"hello,vue!"
}
});
//可以通过console中,动态修改数据
//vm.message="xqh" 不用刷新可以直接在页面中得到反馈修改数据
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<h1 v-if="type==='A'">Ah1>
<h1 v-else-if="type==='B'">Bh1>
<h1 v-else>Ch1>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
data:{
type:'A'
}
});
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<li v-for="item in items">
{{item.message}}
li>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
data:{
items:[
{message:'xqh学Java'},
{message:'xqh学python'}
]
}
});
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<button v-on:click="sayHi">click mebutton>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
//Model:数据
data:{
message:"早安喝了喝了"
},
methods:{//方法必须定义在Vue的Methods对象中 v-on绑定事件
sayHi:function (){
alert(this.message);
}
}
});
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="radio" name="sex" value="男" v-model="xqh"> 男
<input type="radio" name="sex" value="女" v-model="xqh"> 女
<p>
你的性别是:{{xqh}}
p>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
data:{
xqh:''
}
});
script>
body>
html>
实现数据和表单绑定,你选择的或者输入的内容可以及时打印出来
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
下拉框:
<select v-model="selected">
<option >--请选择--option>
<option >--A--option>
<option >--B--option>
<option >--C--option>
select>
<span>你的选择是:{{selected}}span>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el:"#app",
data:{
selected:''
}
});
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<qinjiang v-for="item in items" v-bind:proj="item">qinjiang>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
//定义一个Vue组件commponent
Vue.component("qinjiang",{
props:['proj'],
template: '{{proj}} '
});
var vm = new Vue({
el:"#app",
data:{
items:["Java","python","linux"]
}
});
script>
body>
html>
通过props传递参数
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载DOM、渲染、更新、卸载等一系列过程,我们称这是Vue的生命周期,通俗说就是Vue实例从创建到销毁的过程,就是生命周期
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<style>
[v-clock]{
display: none;
}
style>
head>
<body>
<div id="vue">
<div>{{info.name}}div>
<div>{{info.address.street}}div>
<a v-bind:href="info.url">点我a>
```
```html
currentTime:{{currentTime()}}
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<p>reversedName: {{reversedNameMethod()}}p>
<p>reversedMessage: {{reversedMessageComputed}}p>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'Alex',
message: 'Hello'
},
methods: {
reversedNameMethod: function () {
return this.name.split('').reverse().join('')
}
},
computed: {
reversedMessageComputed: function () {
return this.message.split('').reverse().join('')
}
}
})
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item">todo-items>
todo>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
Vue.component("todo",{
template: '\
\
\
\
\
'
});
Vue.component("todo-title",{
props:['title'],
template: '{{title}}'
});
Vue.component("todo-items",{
props:['item'],
template: '{{item}} '
});
var vm = new Vue({
el: "#app",
data:{
title:"秦老师系列课程",
todoItems:['说Java','说前端','说Linux']
}
})
script>
body>
html>
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems"
:item="item" v-bind:index="index" v-on:remove="removeItems(index)">todo-items>
todo>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
Vue.component("todo",{
template: '\
\
\
\
\
'
});
Vue.component("todo-title",{
props:['title'],
template: '{{title}}'
});
Vue.component("todo-items",{
props:['item','index'],
template: '{{index}}---{{item}} ',
methods:{
remove:function (index){
//自定义事件分发
this.$emit('remove',index)
}
}
});
var vm = new Vue({
el: "#app",
data:{
title:"秦老师系列课程",
todoItems:['说Java','说前端','说Linux']
},
methods: {
removeItems:function (index){
console.log("删除了"+this.todoItems[index]+"ok")
this.todoItems.splice(index,1);//一次删除一个元素
}
}
})
script>
body>
html>
cnpm install vue-router --save-dev
安装好后,在node_modules中可以找到vue-router
如果没找到可以试一试 cnpm install [email protected] --save-dev (因为可能router版本太高)
Content.vue
内容页
Main.vue
首页
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
}
]
})
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
//只有这一个入口
import Vue from 'vue'
import App from './App'
import router from './router' //自动扫描里面的路由配置
Vue.config.productionTip = false
new Vue({
el: '#app',
//配置路由
router,
components: { App },
template: ' '
})
Vue-Router
首页
内容页
定义组件(定义路由) ---->存放路由(router.js)------>配置路由(main.js)---->使用路由(App.vue)
登录页
欢迎登录
登录
请输入账号和密码
import Vue from "vue";
import Router from "vue-router";
import Main from "../views/Main";
import Login from "../views/Login";
Vue.use(Router);
export default new Router({
routes:[
{
path:'/main',
name:'main',
component:Main
},
{
path:'/login',
name:'login',
component:Login
}
]
});
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css';
import router from "./router";
import App from "./App.vue";
Vue.use(ElementUI);
new Vue({
el: '#app',
router,
components: { App },
template: ' ',
render:h=>h(App)
});
main
login
实现在跳转过去的路由再跳转
在view下创建子目录user,创建list.vue 和 profile.vue
先把路由存放到router中的index.js中
import Vue from "vue";
import Router from "vue-router";
import Main from "../views/Main";
import Login from "../views/Login";
import List from "../views/user/List";
import ProFile from "../views/user/ProFile";
Vue.use(Router);
export default new Router({
routes:[
{
path:'/main',
name:'main',
component:Main,
//嵌套路由 children
children:[
{
path:'/user/profile',
component:ProFile
},
{
path:'/user/list',
component:List
}
]
},
{
path:'/login',
name:'login',
component:Login
}
]
});
写Main.vue
用户管理
个人信息
用户列表
内容管理
分类管理
内容列表
个人信息
退出登录
//传递参数
path:'/user/profile/:id',
name:'UserProfile',
component:ProFile,
props:true
个人信息
个人信息
{{id}}
个人信息
{{$route.params.id}}
修改路由配置,代码如下
mode:'history',
404,你的页面走丢了
{
path:'*',
component:NotFound
}
beforeRouterEnter : 在进入路由前执行
beforeRouterLeave :在离开路由前执行
在你要跳转的那个路由,加上钩子,就可以实现在进入这个路由之前和离开这个路由之前的一些操作
参数说明:
cnpm install axios -s
cnpm install vue-axios
import axios from 'axios';
import VueAxios from 'vue-axios'
Vue.use(VueAxios,axios);
个人信息
{{id}}