1、vue的环境配置
安装nodejs 在http://nodejs.cn
检测nodejs是否安装成功 cmd node-v
npm是世界上最大的软件注册表 下载nodejs自带npm
开发不使用npm(来自世界各地的资源 下载不稳定) 使用cnpm
cnpm安装命令 npm install -g cnpm --registry=http://registry.npm.taobao.org
安装vue脚手架 cnpm install -g vue-cli
webpack集成打包
创建项目:vue init webpack 项目文件名 (完整项目安装命令)
整个项目的首页在index.html
cnpm run dev启动文件
完整版的node_modules文件很大
一般使用简洁版 vue init webpack-simple 项目名
现在直接运行简洁版是不能运行的 需要安装依赖 cnpm install
就会出现node_modules
static文件 静态资源文件(js css 图片)
src是开发者文件 要把图片放在static文件里面 放在src文件下会加载不出来
vue文件 temple script style
src/router/inedx.js 里面有路由在路径为“/”时 走helloword.vue文件
2、主文件入口main.js
import Vue from 'vue' //导入vue
import App from './App.vue' //导入主模板
new Vue({
el:"#app", //匹配作用的元素
render:h=>(App) //将主模板渲染到作用元素
})
3、App.vue
数据绑定 {{}}
模板字符串{{'我的名字叫:${obj.name}'}}
数据循环绑定<li v-for="(item,index) in student" :key="index">{{item.name}}</li>
多层渲染(嵌套)<li v-for="(item,index) in student" :key="index">{{item.name+"爱好是:"}}</li>
<li v-for="(hot,k) in item.hobby" :key="k">{{hot.h}}</li>
export default {
name:"app",
data(){
return {
a:1,
str:"fine",
arr:[1,2,3],
obj:{
name:"张三",
sex:"男",
},
student:[
{
name:"小花",
sex:"女",
hobby:[
{h:"篮球"},
{h:"乒乓球"},
{h:"足球"},
]
},
{
name:"小黑",
sex:"男",
hobby:[
{h:"篮球"},
{h:"乒乓球"},
{h:"足球"},
]
}
]
addclass:"block", //style中设定.block大小
test:"请输入"
}
}
}
4、绑定属性
<div v-bind:title="title"></div>``title="标题"
v-html="title"
v-text="title"
把title的值绑定在页面上
绑定class<div class="block"></div>
<div :class="addclass">
多个class的绑定<div :class="{'block':true,'bor':true}">
<div :class="['block','bor']">
绑定元素样式<div :style="{'width':'100px','height':'100px'}">
5、vue数据双向
v-modle 表单元素的使用指令 数据双向 后台数据变化 前台自动变化
数据双向 <input type="text" v-model="test" >
vue里面的事件绑定 @click="" 等价于 v-on:click=""
事件执行的方法 在script标签里 与return同级
<button v-on:click="setmsg()">
<button @click="getmsg()">
keypress 方法 同步变换 console.log(this.test)
methods:[
setmsg(){
this.test="我修改了";
},
getmesg(){
console.log(this.test)
}
]
6、获取dom元素 通过ref 也可以通过原生js进行获取
<div ref="domlist">
<button @click="getdom()">获取dom元素</button>
getdom(){
console.log(this.$ref.domlist);
}
console.log(e.target.getAttribute("data-uid"))
7、列:未完成事项
<input @click="change(index)" type="checkbox" :checked="item.iswan">
//把默认为 未完成的事项更改为已完成
change(index){
this.listdata[index].iswan=!this.listdata[index].iswan;
this.setstorage("news",JSON.stringify(this.listDate));
}
//-------------
<input type="text" v-model="val" @keyup="addDate">
//输入新的事件
addDate(e){
if(e.keyCode===13){
if(this.val.replace(/\w/g,"")){
let todo={
id:this.listdata.length+1,
name:this.val,
iswan:false
}
this.listdata.push(todo)
this.val="";
//写入缓存
this.setstorage("news",JSON.stringify(this.listDate));
}
}
}
//删除
<button @click="btndelete(index)">
btndelete(index){
this.listdata.splice(index,1);
}
查看缓存的方法 控制台application里面的storage
mounted(){
//读取缓存
this.listdata=this.getStorage();
}
//存
setstorage(key,val){
localStorage.setItem(key,val)
},
//读
getstorage(){
return JSON.parse(localStorage.getItem("news"));
}
8、模块化封装缓存
localstorage.js
let storage={
setstorage(key,val){
localStorage.setItem(key,JSON.stringify(val));
},
getstorage(key){
return JSON.parse(localStorage.getItem(key));
},
clearstorage(key){
localStorage.removeItem(key);
},
clearall(){
localStorage.clear();
}
}
//模块暴露
export default storage;
在其他的vue文件中引入这个方法import storage from './路径'
在methods中引入storage.setstorage("news",this.listdata)
9、vue生命周期
①beforeCreate 初始化之后 创建实例之前执行的钩子事件
②created 实例创建完成后执行的钩子
③beforeMount 挂载开始之前调用
④mounted 编译好的html挂载到页面完成后执行的事件钩子
⑤beforeUpdate 更新之前的钩子
⑥update 更新之后的钩子
⑦beforeDestroy 实例销毁之前执行的钩子
⑧destroyed 实例销毁完成时执行的钩子
beforeCreate(){
console.log(1);
}
created(){
console.log(2);
}
beforeMount(){
console.log(3);
}
mounted(){
console.log(4);
}
beforeDestroy(){
console.log(5);
}
destroyed(){
console.log(6);
}
beforeUpdate(){
console.log(7);
}
updated(){
console.log(8);
}
在进入一个简单网页时 beforecreate created beforemount mounted 会触发
beforedestroy destroyed beforeupdate updated 不会触发 只有设置了更新或者销毁操作时才会触发
★beforeupdate updated 的触发
<button @click="updatebtn" v-model="msg">修改数据</button>
export default{
name:"app",
data(){
return {
msg:"welcome to your vue.js app",
}
}
methods:{
updatebtn(){
this.msg="修改信息";
}
}
}
在点击这个btn的时候就触发了信息修改操作 就会触发beforeupdate updated
★beforedestroy destroyed 的触发
我们新建一个vue文件 在app.vue中 引入这个文件
在export default中添加components
挂载:
<button @click="addele"></button>
<v-header v-if="isadd"></v-header>
import headele from './components/header'
data(){
return(){
isadd:true;
}
}
components:{
"v-header":headele;
}
methods:{
addele(){
this.isadd=!this.isadd;
}
}
header.vue
<div id="headele">{{msg}}</div>
export default{
name:"headele",
data(){
return{
msg:"我是子组件"
}
},
methods:{
beforeDestroy(){
}
destroy(){
}
}
}
10、vue请求数据 vue-resource axios fetch-jsonp
vue-resource 官方的 安装命令cnpm install vue-resource --save
安装完成之后要引入 在main.jsimport vuersource from 'vue-resource'
关联到vue上Vue.use(vueresource)
ajax.vue
<button @click="getajax">请求数据</button>
<ul>
<li v-for="(item,index) in student" :key="index">
{{item.name+"------"+item.sex+"----"+item.age}}
</li>
</ul>
data(){
return{
student:mull,
}
}
created:{
this.getajax();
}
methods:{
//执行ajax请求
getajax(){
let url="public/data/data.json",
this.$http.get(url).then((res)=>{
console.log(res);
//res返回的是response对象 res.body将拿到json数据
}
this.student=res.body;
},
getdata(){
console.log(this.student);
}
}
vue-resource的post不能直接用路径请求本地文件 要用 post可以请求远程路径
axios cros跨域
fetch-jsonp jsonp跨域
11、mockjs数据模拟
cnpm install mockjs --save
新建mock文件夹 下建立mock.js文件
get 和post 的请求方式如下
import Mock from "mockjs";
Mock.mock("/list","get",{
result:[
{
name:"小花",
sex:"女"
},{
name:"小黑",
sex:"男"
}
]
});//请求配置 路径 请求方式
Mock.mock("/info","post",()=>{
return {
result:[
{
name:"小花",
sex:"女"
},{
name:"小黑",
sex:"男"
}
]
}
})
在main.js中引入mock
require("./mock/mock.js");
在app.js中使用vue-resource 请求mock模拟数据
getajax(){
this.$http.get("./list").then((res)=>{
console.log(res.body.result);
})
}
vue-resource是官方的插件还有axios fentch-jsonp
11、axios 跨域
安装 cnpm install axios --save
新建axios.vue要显示的话要挂在app.vue上 标签 import components三步
下面是两种请求方法
<template>
<script>
import Axios from "axios"
mounted(){
Axios.get("/list").then((res)=>{
console.log(res.data.result);
}).catch(()=>{}).finally(()=>{});
Axios({
method:"get",
data:mull,
url:"/list"
}).then((res)=>{
console.log(res.data.result);
})
}
12、fentch-jsonp跨域
安装 cnpm install fentch-jsonp --save
fetch.vue
<template>
<script>
import fetchjsonp from "fetch-jsonp";
mounted(){
fetchjsonp.get("url").then((res)=>{
//jsonpCallback:"custon_callback", 设置回调函数名
//jsonpCallbackFunction:"getdata"
//timeout:1000, 设置请求事时间
}).then((res)=>{
return res.json();
})
}
在app.vue中 引入fetch-jsonp 标签 import components
import fetch from "./components/fetch";
components:{
fetch,
}
13、子父组件传值
★父组件向子组件传值
在index.html中引入css文件 public/css/?
子组件header.vue 父组件app.vue
在export default{}中声明 props属性props:["title"]
<div>父容器传递给我的属性----{{title}}</div>
<div id="h-header">
<div>父容器传递给我的属性为----{{title}}</div>
</div>
export default{
name:"h-header",
//props:["title"],
props:{
/*限制传递变量类型 类型首字母大写
如果app.vue中的 title:123 会报错*/
'title':String,
}
data(){
return{
}
}
}
app.vue 中注册header 在header的标签里<v-header :title="title">
然后在app.vue的script标签内写出需要传递的title的值
<div id="app">
<v_header :title="title"></v_header>
</div>
import v_header from "./components/header";
export default{
name:"app",
components:{
v_header,
},
data(){
return {
title:"商家"
}
}
}
★子组件给父组件传值
①通过ref获取
//app.vue
<v_header ref="header">
import v_header from "./components/header";
components:{
v_header,
}
mounted(){
let=this.$ref.header;
//header代表了整个子组件对象
header.getson();
console.log(header.title);//输出 商家
}
}
//header.vue
mounted(){
getson(){
console.log("父组件执行了我的方法");
}
}
★子组件主动获取父组件的方法和属性$parent
//header.vue
mounted(){
console.log(this.$parent);
let app=this.$parent;
app.getfather();//会输出 子组件调用我的方法
}
//app.vue
methods:{
getfather(){
console.log("子组件调用我的方法");
}
}
//header.vue
props:{
'parent':Object
}
mounted(){
console.log(this.parent)
}
//app.vue
<v_header :parent="my">
data(){
return{
my:this
}
}
14、非子父组件传值$emit
$on
footer.vue
在app.vue挂载footer.vue
建立一个广播文件src/emit/emit.js
//emit.js
import Vue from "vue";
let vue=new Vue();
export default vue;
在header里面发送广播
//header.vue 发送广播
<template>
<button @click="sendmsg">发送广播</button>
<script>
import Emit from '../emit/emit.js';
data(){
return{
msg:"我是header",
}
}
methods(){
sendmsg(){
Emit.$emit("sendmessage",this.msg);
//广播名sendmessage 发送的广播 this.msg
}
}
<style>
//footer.vue 接收广播
<div>接收数据------{{send}}</div>
import Emit from '../emit/emit.js';
data(){
return {
send:"",
}
}
mounted(){
Emit.$on("sendmessage",(res)=>{
console.log(res);
this.send=res;
})
}
15、vue路由 vue-router
安装 cnpm install vue-router --save
在main.js中引入vue-router
import Vue from "./App.vue";
//引入路由
import vuerouter from "vue-router";
//配置路由 实例化路由
let router=new vuewrouter({
mode:"history",
routes:[
{
path:"",
component:""
}
]
})
//使用路由
Vue.use(vuerouter);
new Vue({
el:"app",
router,//挂载路由
render:h=>h(App),
})
路由的模块化封装src/router/router.js
import Vue from "vue";
import vuerouter from "vue-router";
let router=new vuerouter({
routes:[
{
path:"",
component:""
}
]
})
Vue.use(vuerouter);
export default router;
//app.vue
//在配置路由引入某界面的时候将不需要import 标签 和 components
//router-link将会被解析为a链接 router-link路由的入口
<router-link to="/">首页</router-link>
//路由的出口
<router-view></router-view>
我们建立一个子页面 child.vue
<div id="firstpage"></div>
在main.js中引入在app.vue中需要的路由
import firstpage from "./components/child";
import vuerouter from "vue-router";
let router=new vuerouter({
mode:"history",
routes:[
{
path:"/",
component:firstpage
}
]
})
Vue.use(vuerouter);
new vue({
el:"#app",
router,
render:h=>h(App)
})
★通过id实现路由的切换寻找详细的内容
//main.js
import news from "./components/news"
let router=new vuerouter({
mode:"history",
routes:[
{
path:"/news/:id",
components:news
}
]
})
//app.vue
<div v-for="(item,index) in news" :key="index">
<router-link :to="'/news/${item.id}'">{{item.title}}</router-link>
//或者写成 :to="'/news/+index'"
</div>
data(){
return {
news:[
{
id:1,
title:"新闻1",
},{
id:2,
title:"新闻2",
}
]
}
}
//news.vue
<div>{{message}}</div>
data(){
return{
list:[
{
content:"新闻1的内容"
},
{
content:"新闻2的内容"
}
],
message:null
}
}
mounted(){
this.getdata();
}
methods:{
getdate(){
console.log(this.$route.params);
let id=this.$route.params.id-1;
this.message=this.list[id].content;
}
}
//监听路由
watch:{
"$route"(to,from){
if(this.$route.params){
this.getdata();
}
}
}
16、mint UI
安装命令cnpm install mint-UI --save
在main.js中引入mint UI
import Mint from "mint-ui";
Vue.use(Mint);
把mint UI里响应的标签放在需要的页面上
!需要引入mint UI的css 在main.js中import 'mint-ui/lib/style.css'
★引入ElementUI
提示插件 Element UI Snippets
//main.js
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);