<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<p id="content">{{msg}}p>
div>
<script type="text/javascript">
//2.创建vue的实例
var vm=new Vue({
el:'#app', //表示当前我们new的这个vue实例,要控制页面上哪个区域
data:{ //存放的el中用到的数据
msg:'欢迎学习Vue'
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
[v-cloak]{
display:none;
}
style>
head>
<body>
<div id="app">
<p v-cloak>+++{{cloak}}+++p>
<h4 v-text="text">h4>
<p v-html="html">p>
<input type="button" value="按钮" v-bind:title="bind+'表达式变长'">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
cloak:'cloak指令渲染',
text:'text指令渲染',
html:'大大大
',
bind:'bind指令渲染'
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="button" v-bind:value="on" v-on:click="show">input>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
on:"v-on指令渲染"
},
methods:{//这个methods属性中定义了当前Vue实例所有可用的方法
show:function(){
alert('触发事件');
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<h4>{{msg}}h4>
<input type="button" value="走" v-on:click="go">
<input type="button" value="停" v-on:click="stop">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
msg:'跑马灯效果',
intervalId:null
},
methods:{
go(){
//在vm实例中,如果想要调用data上的数据,或者想要调用methods中的方法,必须通过this.数据属性名或this.方法名来进行访问。这里的this代表的是new出来的vm对象.
if(this.intervalId!=null)
return
this.intervalId = setInterval(() => {
//因为这里面的this是window对象了,不是vm对象,所以需要先在外层获取一遍值
var start = this.msg.substring(0,1)
var end = this.msg.substring(1)
this.msg = end + start
},400)
},
stop(){
clearInterval(this.intervalId)
// 每当清除了定时器以后,需要重新把intervalId重置为null
this.intervalId = null
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style>
.inner{
height:150px;
background-color:skyblue;
}
style>
head>
<body>
<div id="app">
<div class="inner" v-on:click="divHandle">
<input type="button" value="按钮" v-on:click="btnHandle">
<input type="button" value="按钮" v-on:click.stop="btnHandle">
div>
<a href="http://www.baidu.com" v-on:click="linkClick">去百度a>
<a href="http://www.baidu.com" v-on:click.prevent="linkClick">去百度a>
<div class="inner" v-on:click.capture="divHandle">
<input type="button" value="按钮" v-on:click="btnHandle">
div>
<div class="inner" v-on:click.self="divHandle">
<input type="button" value="按钮" v-on:click="btnHandle">
div>
<a href="http://www.baidu.com" v-on:click.prevent.once="linkClick">去百度a>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
},
methods:{
divHandle(){
console.log('这是触发了innerDiv的点击事件')
},
btnHandle(){
console.log('这是触发了btn 按钮的触发事件')
},
linkClick(){
console.log('触发了链接的点击事件')
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<h4>{{msg}}h4>
<input type="text" v-model="msg">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
msg:'五笔好啊'
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="number1">
<select v-model="opt">
<option value="+">+option>
<option value="-">-option>
<option value="*">*option>
<option value="/">/option>
select>
<input type="text" v-model="number2">
<input type="button" value="=" v-on:click="calc">
<input type="text" v-model="result">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
number1:0,
number2:0,
result:0,
opt:'+'
},
methods:{
calc(){
console.log('点击了等号')
switch(this.opt){
case '+':
this.result=parseInt(this.number1)+parseInt(this.number2)
break
case '-':
this.result=parseInt(this.number1)-parseInt(this.number2)
break
case '*':
this.result=parseInt(this.number1)*parseInt(this.number2)
break
case '/':
this.result=parseInt(this.number1)/parseInt(this.number2)
break
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
.red{
color:red;
}
.thin{
font-weight: 200;
}
.italic{
font-style: italic;
}
.active{
letter-spacing: 0.5em;
}
style>
head>
<body>
<div id="app">
<h1 v-bind:class="['red','thin','italic']">五笔也太棒了吧h1>
<h1 v-bind:class="['red','thin',flag?'active':'']">五笔也太棒了吧h1>
<h1 v-bind:class="['red','thin',{'active':flag}]">五笔也太棒了吧h1>
<h1 v-bind:class="{'red':true,'thin':true,'italic':true,'active':false}">五笔也太棒了吧h1>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
flag:true
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<h1 v-bind:style="{'color':'red','font-weight':'200'}">这是一个h1h1>
<h1 v-bind:style="style">这是一个h1h1>
<h1 v-bind:style="[style,style2]">这是一个h1h1>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
style:{'color':'red','font-weight':'200'},
style2:{'fontStyle':'italic'}
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<p>{{list[0]}}p>
<p>{{list[1]}}p>
<p v-for="(item,index) in list">
内容是{{item}},索引值是{{index}}
p>
<p v-for="(user,index) in objList">
id:{{user.id}},name:{{user.name}},索引是{{index}}
p>
<p v-for="(value,key,index) in user">
值为{{value}},键名为{{key}},索引为{{index}}
p>
<p v-for="count in 2">这是第{{count}}次循环p>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[1,2],
objList:[
{id:1,name:'zs1'},
{id:2,name:'zs2'}
],
user:{
id:1,
name:'托尼'
}
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<div>
<label>
Id:<input type="text" v-model="id">
label>
<label>
Name:<input type="text" v-model="name">
label>
<input type="button" value="添加" v-on:click="add">
div>
<p v-for="item in list" v-bind:key="item">
<input type="checkbox">
{{item.id}}-----{{item.name}}
p>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'李斯'},
{id:2,name:'嬴政'},
{id:3,name:'赵高'}
],
id:'',
name:''
},
methods:{
add(){
this.list.unshift({id:this.id,name:this.name});
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="button" value="toggle" v-on:click="toggle">
<h3 v-if="flag">这是用v-if控制的元素h3>
<h3 v-show="flag">这是用v-show控制的元素h3>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
flag:true
},
methods:{
toggle(){
this.flag=!this.flag;
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name">
<input type="button" value="添加" v-on:click="add()">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in list" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime}}td>
<td><a href="">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name">
<input type="button" value="添加" v-on:click="add()">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in list" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<p>{{msg | filter1('九') | filter2 }}p>
div>
<script type="text/javascript">
// filter(过滤器名字,function(数据,想要传入的参数....))
Vue.filter('filter1',function(data,num){
// 返回一个修改过以后的字符串
return data.replace(/七/g,num)
})
Vue.filter('filter2',function(data){
return data+"这是第二个过滤器"
})
var vm=new Vue({
el:'#app',
data:{
msg:"七根藤上七个葫芦,七个葫芦变成七个葫芦娃"
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=date.getMonth()+1
var d=date.getDate()
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours()
var min=date.getMinutes()
var s=date.getSeconds()
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=date.getMonth()+1
var d=date.getDate()
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours()
var min=date.getMinutes()
var s=date.getSeconds()
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
},
filters:{ //私有的过滤器
timeFilter:function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=date.getMonth()+1
var d=date.getDate()
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours()
var min=date.getMinutes()
var s=date.getSeconds()
return `${y}-${m}-${d} ${h}:${min}:${s}~~~~~~~~~~~`
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name" v-on:keyup.f2="add()">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
// 自定义全局的按键修饰符
Vue.config.keyCodes.f2=113
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
},
filters:{ //私有的过滤器
timeFilter:function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}~~~~~~~~~~~`
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name" v-on:keyup.f2="add()">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords" v-focus>
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
// 自定义全局的按键修饰符
Vue.config.keyCodes.f2=113
// 使用Vue.directive() 定义全局的指令 v-focus
// 其中:参数1:指令的名称,注意,在定义的时候,指令的名称前面不需要加上v-前缀
// 但是:在调用的时候,必须在指令名称前加上v-前缀进行调用
// 参数2:是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
Vue.directive('focus',{
bind:function(el){
//每当当前指令被绑定到元素上的时候,会立即执行这个bind函数,只执行一次
//这个el元素是一个原声的js对象
// 在元素刚绑定了指令的时候,还没偶插入到DOM中去,这时候,调用focus方法没有作用,因为一个元素只有插入DOM树之后,才能执行
// el.focus()
},
inserted:function(el){
//inserted表示元素插入到dom树中的时候才会触发
el.focus()
},
updated:function(el){
//当VNode更新的时候,会执行updated,可能会触发多次
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
},
filters:{ //私有的过滤器
timeFilter:function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}~~~~~~~~~~~`
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name" v-on:keyup.f2="add()">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords" v-focus v-color="'blue'">
<table>
<thead>
<tr>
<td>Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
// 自定义全局的按键修饰符
Vue.config.keyCodes.f2=113
// 使用Vue.directive() 定义全局的指令 v-focus
// 其中:参数1:指令的名称,注意,在定义的时候,指令的名称前面不需要加上v-前缀
// 但是:在调用的时候,必须在指令名称前加上v-前缀进行调用
// 参数2:是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
Vue.directive('focus',{
bind:function(el){
//每当当前指令被绑定到元素上的时候,会立即执行这个bind函数,只执行一次
//这个el元素是一个原声的js对象
// 在元素刚绑定了指令的时候,还没偶插入到DOM中去,这时候,调用focus方法没有作用,因为一个元素只有插入DOM树之后,才能执行
// el.focus()
},
inserted:function(el){
//inserted表示元素插入到dom树中的时候才会触发
//写入和js行为相关的操作
el.focus()
},
updated:function(el){
//当VNode更新的时候,会执行updated,可能会触发多次
}
})
Vue.directive('color',{
// 第一个参数为元素对象,第二个为指令信息,其中包含的几个主要属性分别为:value计算出来的值,expression表达式,name指令名字
bind:function(el,binding){
// 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定会有一个内联的样式
//和样式相关的操作
el.style.color=binding.value
console.log(`binding.name:${binding.name},binding.expression:${binding.expression}`)
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
},
filters:{ //私有的过滤器
timeFilter:function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}~~~~~~~~~~~`
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="id">
<input type="text" v-model="name" v-on:keyup.f2="add()">
<input type="button" value="添加" v-on:click="add()">
<input type="text" v-model="keywords" v-focus v-color="'blue'">
<table>
<thead>
<tr>
<td v-fontweight="900">Idtd>
<td>Nametd>
<td>Ctimetd>
<td>Operationtd>
tr>
thead>
<tbody>
<tr v-for="car in search(keywords)" v-bind:key="car.id">
<td>{{car.id}}td>
<td v-text="car.name">td>
<td>{{car.ctime | timeFilter()}}td>
<td><a href="" v-on:click.prevent="del(car.id)">删除a>td>
tr>
tbody>
table>
div>
<script type="text/javascript">
// 设置全局的过滤器
Vue.filter('timeFilter',function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}`
}
})
// 自定义全局的按键修饰符
Vue.config.keyCodes.f2=113
// 使用Vue.directive() 定义全局的指令 v-focus
// 其中:参数1:指令的名称,注意,在定义的时候,指令的名称前面不需要加上v-前缀
// 但是:在调用的时候,必须在指令名称前加上v-前缀进行调用
// 参数2:是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
Vue.directive('focus',{
bind:function(el){
//每当当前指令被绑定到元素上的时候,会立即执行这个bind函数,只执行一次
//这个el元素是一个原声的js对象
// 在元素刚绑定了指令的时候,还没偶插入到DOM中去,这时候,调用focus方法没有作用,因为一个元素只有插入DOM树之后,才能执行
// el.focus()
},
inserted:function(el){
//inserted表示元素插入到dom树中的时候才会触发
//写入和js行为相关的操作
el.focus()
},
updated:function(el){
//当VNode更新的时候,会执行updated,可能会触发多次
}
})
Vue.directive('color',{
// 第一个参数为元素对象,第二个为指令信息,其中包含的几个主要属性分别为:value计算出来的值,expression表达式,name指令名字
bind:function(el,binding){
// 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定会有一个内联的样式
//和样式相关的操作
el.style.color=binding.value
console.log(`binding.name:${binding.name},binding.expression:${binding.expression}`)
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'宝马',ctime:new Date()},
{id:2,name:'奔驰',ctime:new Date()}
],
id:"",
name:"",
keywords:""
},
methods:{
add(){
var car={id:this.id,name:this.name,ctime:new Date()}
this.list.push(car)
this.id=""
this.name=""
},
del(id){
// 循环list,当其中的id等于传入的id的时侯,暂停循环,其中的i,代表的是index,用index才能删除
// this.list.some((item,index)=>{
// if(item.id == id){
// // 删除一个,位置为index
// this.list.splice(index,1);
// //返回true时,退出循环
// return true;
// }
// })
// 同理,先获得index,再删除
var index=this.list.findIndex(item=>{
if(item.id == id){
return true;
}
})
this.list.splice(index,1);
},
search(keywords){
// // 新建一个list,用来存放结果
// var newList=[]
// // 循环原来的list
// this.list.forEach(item=>{
// // 如果单个个体中.indexOf(keywords)!=-1,说明在这里面找到了这串字符串,即可以添加到新的数组中去。
// // 同时,这个方法对于当keywords=""的情况也是能找到的所以比较适合用这个方法
// if(item.name.indexOf(keywords)!=-1){
// newList.push(item)
// }
// })
// return newList
// 这个函数可以返回一个新的数组,而这个数组自己定义,不断返回叠加形成要返回的数组
return this.list.filter(item=>{
// 当满足条件,那么就返回一个item给新的list
if(item.name.includes(keywords)){
return item;
}
})
}
},
filters:{ //私有的过滤器
timeFilter:function(data,pattern=""){
//根据传入的模式判断要什么格式的时间
var date=new Date(data)
var y=date.getFullYear()
var m=(date.getMonth()+1).toString().padStart(2,'0')
var d=date.getDate().toString().padStart(2,'0')
// 如果是yyyy-mm-dd那么就返回这个格式
if(pattern.toLowerCase()=='yyyy-mm-dd'){
// 使用``来格式化输出,${}为占位符
return `${y}-${m}-${d}`
} else{
var h=date.getHours().toString().padStart(2,'0')
var min=date.getMinutes().toString().padStart(2,'0')
var s=date.getSeconds().toString().padStart(2,'0')
return `${y}-${m}-${d} ${h}:${min}:${s}~~~~~~~~~~~`
}
}
},
directives:{
//私有的自定义指令
fontweight:function(el,binding){
el.style.fontWeight=binding.value
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<h3 id="h3">{{msg}}h3>
<input type="button" value="修改" v-on:click="msg='ok'">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
msg:"测试数据"
},
methods:{
show(){
console.log("执行了show方法")
}
},
beforeCreate(){//这是我们遇到的第一个生命周期函数,表示完全被创建出来之前,会执行它
// console.log(this.msg)
// this.show()
// 注意:在beforeCreate生命周期函数执行的时候,data和methods中的数据都还没有被初始化
},
created(){//遇见的第二个生命周期函数
// console.log(this.msg)
// this.show()
//此时的data和methods方法都初始化完成,所以可以调用了
},
beforeMount(){//这是遇见的第三个生命周期函数,表示,模板已经在内存中编译完成,但是还没有渲染到页面中
// console.log(document.getElementById("h3").innerText)
//在beforeMount执行的时候,页面中的数据还没有被真正的替换过来,只是之前写的一些字符模板字符串
},
mounted(){//遇见的第四个生命周期函数,表示内存中的模板,已经被真正的挂载到了页面上,用户可以看到渲染好的页面了
// console.log(document.getElementById('h3').innerText)
//mounted是实例创建期间的最后一个生命周期函数,但执行完mounted,就表示,实例已经完全创建好了,如果没有别的操作,这个实例就创建好了
},
beforeUpdate(){//表示更新时,遇见的第一个生命周期函数
// console.log("data:"+this.msg+"页面:"+document.getElementById('h3').innerText)
//数据被更新,但是页面还没有被渲染
},
updated(){//表示更新时,遇见的第二个生命周期函数
// console.log("data:"+this.msg+"页面:"+document.getElementById('h3').innerText)
//不仅内存中的数据被更新了,而且页面也被渲染了
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue.resource-1.5.1.js">script>
head>
<body>
<div id="app">
<input type="button" value="get请求" v-on:click="getInfo()">
<input type="button" value="post请求" v-on:click="postInfo()">
<input type="button" value="jsonp请求" v-on:click="jsonpInfo()">
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
},
methods:{
getInfo(){
this.$http.get('http://jsonplaceholder.typicode.com/posts',{}).then(function(result){
console.log(result)
})
},
postInfo(){//手动发起的post请求,默认没有表单格式,所以有的服务器处理不了,通过post方法的第三个参数{emulateJSON:true}设置提交内容类型为普通表单数据
this.$http.post('http://jsonplaceholder.typicode.com/posts',{},{emulateJSON:true}).then(function(result){
console.log(result.body)
})
},
jsonpInfo(){
this.$http.jsonp('http://jsonplaceholder.typicode.com/posts',{}).then(function(result){
console.log(result.body)
})
}
}
})
script>
body>
html>
js端代码
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
div>
<script type="text/javascript">
function a(data){
console.log(data)
}
script>
<script src="http://localhost:8080//sliver/test/a">script>
body>
html>
服务器端
@RequestMapping("/test/{functionName}")
@ResponseBody
public String test(@PathVariable(name = "functionName") String functionName){
System.out.println("测试成功");
List<Integer> arrayList=new ArrayList();
arrayList.add(1);
arrayList.add(2);
return functionName+"("+arrayList.toString()+")";
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue.resource-1.5.1.js">script>
head>
<body>
<div id="app">
<input type="button" value="post请求" v-on:click="post()">
div>
<script type="text/javascript">
// 统一请求的根路径
Vue.http.options.root='http://jsonplaceholder.typicode.com'
// 不用再写emulateJSON=true
Vue.http.options.emulateJSON=true
var vm=new Vue({
el:'#app',
data:{
},
methods:{
post(){
this.$http.post('posts',{}).then(
function(result){
console.log(result.body)
})
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<link rel="stylesheet" href="./lib/animate.min.css">
head>
<style type="text/css">
.my-enter,.my-leave-to{/*代表的是最开始或者最后的时间段*/
opacity:0;
transform: translateX(150px);
}
.my-enter-active,.my-leave-active{/*代表的是进入或者离场时候的时间段,不需要使用v-enter-to或者v-leave,直接用这两个就行了*/
transition: all 0.8s ease;
}
style>
<body>
<div id="app">
<input type="button" value="切换" v-on:click="flag=!flag">
<transition name="my">
<h3 v-if="flag">过渡动画测试用例h3>
transition>
<hr>
<input type="button" value="切换" v-on:click="flag1=!flag1">
<transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut" v-bind:duration="{'enter':200,'leave':800}">
<h3 v-if="flag1">过渡动画测试用例h3>
transition>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
flag:false,
flag1:false
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<link rel="stylesheet" href="./lib/animate.min.css">
head>
<style type="text/css">
.ball{
width: 15px;
height: 15px;
border-radius: 50%;
background-color: red;
}
style>
<body>
<div id="app">
<input type="button" value="动起来" v-on:click="flag=!flag">
<transition v-on:before-enter="beforeEnter" v-on:enter="Enter" v-on:after-enter="afterEnter">
<div class="ball" v-show="flag">div>
<transition>
div>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
flag:false
},
methods:{
// 生命周期钩子函数的第一个参数一般都是el,代表了要操作的dom对象
beforeEnter(el){
el.style.transform="translate(0,0)"
},
// done代表的是下一个要执行的钩子函数,必须要执行以下,否则可能出现bug
Enter(el,done){
// 必须要加上这一行,否则不会出现动画效果,可以理解为不断刷新
el.offsetWidth
el.style.transform="translate(150px,450px)"
el.style.transition="all 1s ease"
done()
},
afterEnter(el){
this.flag=!this.flag
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
.my-enter,.my-leave-to{/*代表的是最开始或者最后的时间段*/
opacity:0;
transform: translateX(150px);
}
.my-enter-active,.my-leave-active{/*代表的是进入或者离场时候的时间段,不需要使用v-enter-to或者v-leave,直接用这两个就行了*/
transition: all 0.8s ease;
}
style>
head>
<body>
<div id="app">
<input type="text" v-model="name" v-on:keyup.enter="add" v-focus>
<ul>
<transition-group name=my>
<li v-for="item in list" v-bind:key="item.id">
{{item.id}}:{{item.name}}
li>
transition-group>
ul>
div>
<script type="text/javascript">
Vue.directive('focus',{
inserted:function(el){
el.focus()
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'李健'},
{id:2,name:'清华'}
],
name:''
},
methods:{
add(){
var person={'id':this.list.length+1,'name':this.name}
this.list.push(person)
this.name=''
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
.my-enter,.my-leave-to{/*代表的是最开始或者最后的时间段*/
opacity:0;
transform: translateX(150px);
}
.my-enter-active,.my-leave-active{/*代表的是进入或者离场时候的时间段,不需要使用v-enter-to或者v-leave,直接用这两个就行了*/
transition: all 0.8s ease;
}
/*元素移动的时候的默认写法,记住就行了*/
.my-move{
transition: all 0.6s ease;
}
.my-leave-active{
position: absolute;
}
style>
head>
<body>
<div id="app">
<input type="text" v-model="name" v-on:keyup.enter="add" v-focus>
<ul>
<transition-group name=my>
<li v-for="(item,index) in list" v-bind:key="item.id" v-on:click="del(index)">
{{item.id}}:{{item.name}}
li>
transition-group>
ul>
div>
<script type="text/javascript">
Vue.directive('focus',{
inserted:function(el){
el.focus()
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'李健'},
{id:2,name:'清华'}
],
name:''
},
methods:{
add(){
var person={'id':this.list.length+1,'name':this.name}
this.list.push(person)
this.name=''
},
del(index){
this.list.splice(index,1)
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
.my-enter,.my-leave-to{/*代表的是最开始或者最后的时间段*/
opacity:0;
transform: translateX(150px);
}
.my-enter-active,.my-leave-active{/*代表的是进入或者离场时候的时间段,不需要使用v-enter-to或者v-leave,直接用这两个就行了*/
transition: all 0.8s ease;
}
/*元素移动的时候的默认写法,记住就行了*/
.my-move{
transition: all 0.6s ease;
}
.my-leave-active{
position: absolute;
}
style>
head>
<body>
<div id="app">
<input type="text" v-model="name" v-on:keyup.enter="add" v-focus>
<transition-group name='my' appear tag='ul'>
<li v-for="(item,index) in list" v-bind:key="item.id" v-on:click="del(index)">
{{item.id}}:{{item.name}}
li>
transition-group>
div>
<script type="text/javascript">
Vue.directive('focus',{
inserted:function(el){
el.focus()
}
})
var vm=new Vue({
el:'#app',
data:{
list:[
{id:1,name:'李健'},
{id:2,name:'清华'}
],
name:''
},
methods:{
add(){
var person={'id':this.list.length+1,'name':this.name}
this.list.push(person)
this.name=''
},
del(index){
this.list.splice(index,1)
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<template1>template1>
<template2>template2>
<template3>template3>
<template4>template4>
div>
<template id="id">
<div>
<h1>可以通过在vue实例的html元素外面写一个template标签,而这里面的内容就会变成我们所需要的模板内容,而且不会被页面解析h1>
<h1>需要给template标签设置一个名字,这样子就能通过Vue.component将模板赋值给组件了h1>
<h1>注意只能有一个根标签,所以用了一个div包裹住h1>
div>
template>
<script type="text/javascript">
// 组件中都只能有一个根元素,多了则报错
// 组件的第一种创建方式,先创建模板,再赋给组件
var template1=Vue.extend({
template:"这是组件的写法
"
})
Vue.component("template1",template1)
// 组件的第二种创建方式
Vue.component('template2',{
template:"组建创建方法2
"
})
// 组件的第三种创建方式
Vue.component('template3',{
template:"#id"
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
components:{ //创建私有的组件,而创建方法同样使用上面三种
template4:{
template:"#id"
},
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<temp>temp>
<hr>
<temp>temp>
div>
<template id="temp">
<div>
<input type="button" value="+1" v-on:click="add">
{{count}}
div>
template>
<script type="text/javascript">
// 1、component组件中自带有data属性
// 2、data必须为一个方法体,这是因为每个组件之间不应该有任何的联系,所以应该是一个方法体,并返回一个对象,而这个对象,也只属于当前调用的模板
// 3、data的方法体必须返回一个对象,其实相当于将原来vue实例中创建对像的数据当作一个对象,返回。结果是一样的。,而我们的methods或者模板都能够调用这个参数
// 4、使用方法和原来的代码中使用Vue实例的data一致
Vue.component('temp',{
template:'#temp',
data:function(){
return {count:0}
},
methods:{
add(){
this.count++
}
}
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<style type="text/css">
.v-enter,.v-leave-to{
opacity: 0;
transform: translateX(150px);
}
.v-enter-active,.v-leave-active{
transition:all 1s ease;
}
style>
head>
<body>
<div id="app">
<div v-on:click="flag=true">登陆div>
<div v-on:click="flag=false">注册div>
<login v-if="flag">login>
<register v-else="flag">register>
<div v-on:click="componentName='login'">登陆div>
<div v-on:click="componentName='register'">注册div>
<transition mode="out-in">
<component v-bind:is="componentName">component>
transition>
div>
<script type="text/javascript">
Vue.component('login',{
template:'登陆组件
'
})
Vue.component('register',{
template:'注册组件
'
})
var vm=new Vue({
el:'#app',
data:{
flag:false,
componentName:'login'
},
methods:{
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<id v-bind:parentmsg="msg">id>
div>
<template id="id">
<div>
<h3>{{msg}}h3>
{{parentmsg}}
div>
template>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
msg:"父组件的信息"
},
methods:{
},
components:{
id:{
template:"#id",
data:function(){
//可读可写
//都是私有的属性
return {msg:"子组件的信息"}
},
//可读不可写
//这是父组件传入的属性
props:['parentmsg']
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<son v-on:func="father">son>
div>
<template id="son">
<div>
<input type="button" value="调用自己的方法来触发爹的方法" v-on:click="son">
div>
template>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
},
methods:{
father(data,data1){
console.log("这不就是爹的方法了么-----"+data+data1)
}
},
//1、先写一个组件
components:{
son:{
template:'#son',
// 4、在调用儿子函数的时候,顺带调用父亲的函数
methods:{
son(){
console.log("先执行了儿子的方法")
// 5、使用this.$emit方法调用父函数,而参数这是按照这样的格式一个个排列下去
this.$emit('func',1,2)
}
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<son v-bind:personlist="list" v-on:func="loadComments">
son>
<ul>
<li v-for="item in list" v-bind:key="item.id">
姓名为{{item.name}},内容为{{item.content}}
li>
ul>
div>
<template id="son">
<div>
姓名<input type="text" v-model="name">
内容<input type="textarea" v-model="content">
<input type="button" value="添加" v-on:click="add">
div>
template>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
list:[]
},
methods:{
loadComments(){
// 从localStorage中加载数据,如果加载内容为空则返回[]
var list=JSON.parse(localStorage.getItem('cmts')||'[]')
// 然后覆盖当前的页面中设置的内容
this.list=list
}
},
components:{
son:{
template:'#son',
data:function(){
return {id:'',name:'',content:''}
},
methods:{
add(){
//1、先获取输入的内容
var comment={id:new Date(),name:this.name,content:this.content}
//2、获取父组件中所有的list信息,其实就是父组件传进来的personList
var list=this.personlist
//3、给这个list新增信息
list.unshift(comment)
//4、将列表放到localStorage中
localStorage.setItem('cmts',JSON.stringify(list))
//5、设置名字和内容皆为空,还原表单
this.name=this.content=''
//6、当新增完以后,需要调用父组件的loadComments方法,来刷新父组件的数据,才可能让页面的显示数据为最新版本的
this.$emit('loadComments')
}
},
props:['personlist']
}
},
created(){
// 在数据和方法初始化完成以后,使用loadComment方法,这样子才可以更新数据
this.loadComments()
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
<h3 ref="h3">测试h3>
<input type="button" value="获取dom元素" v-on:click="common">
<son ref="myson">son>
<input type="button" value="获取子组件元素" v-on:click="component">
div>
<template id="son">
<div>
<h3>{{msg}}h3>
div>
template>
<script type="text/javascript">
var vm=new Vue({
el:'#app',
data:{
},
methods:{
common(){
// 可以直接获取dom元素,前提,标签上要设置ref
console.log(this.$refs.h3.innerText)
},
component(){
// 前提,子组件标签上要设置ref
// 直接获取子组件中的data
console.log(this.$refs.myson.msg)
// 直接调用子组件中的方法
this.$refs.myson.son()
}
},
components:{
son:{
template:"#son",
data:function(){
return {
msg:"ok"
}
},
methods:{
son(){
console.log("子方法")
}
}
}
}
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
head>
<body>
<div id="app">
<a href="#/login">logina>
<a href="#/register">registera>
<router-link to="/login" tag="span">loginrouter-link>
<router-link to="/register" tag="h3">registerrouter-link>
<router-view>router-view>
div>
<script type="text/javascript">
// 2、创建对应的摸板
var login={
template:'login
'
}
var register={
template:'register
'
}
// 3、创建路由对象,在其中指定路由规则
var router=new VueRouter({
routes:[
// redirect强制使用对应路由的template,可以用来设置初始页面显示登录页
{path:'/',redirect:'/login'},
// 这里面用的component指的是模板的名字,不是组件的名字,所以在这个例子里面,没有创建组件
{path:'/login',component:login},
{path:'/register',component:register}
]
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
// 4、建立Vue和VueRouter之间的练习
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
<style type="text/css">
.router-link-active{
color:skyblue;
}
.myactive{
color:blue;
}
style>
head>
<body>
<div id="app">
<router-link to="/login">loginrouter-link>
<router-link to="/register">registerrouter-link>
<router-view>router-view>
div>
<script type="text/javascript">
var login={
template:"login
"
}
var register={
template:"register
"
}
var router = new VueRouter({
routes:[
{path:'/login',component:login},
{path:'/register',component:register}
],
linkActiveClass:'myactive'
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
<style type="text/css">
.router-link-active{
color:skyblue;
}
.myactive{
color:blue;
}
.v-enter,.v-leave-to{
opacity: 0;
transform: translateX(150px);
}
.v-enter-active,.v-leave-active{
transition: all 1s ease;
}
style>
head>
<body>
<div id="app">
<router-link to="/login">loginrouter-link>
<router-link to="/register">registerrouter-link>
<transition mode="out-in">
<router-view>router-view>
transition>
div>
<script type="text/javascript">
var login={
template:"login
"
}
var register={
template:"register
"
}
var router = new VueRouter({
routes:[
{path:'/login',component:login},
{path:'/register',component:register}
],
linkActiveClass:'myactive'
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
head>
<body>
<div id="app">
<router-link to="/login?id=10&name=lisi">loginrouter-link>
<router-link to="/register/20/zhangsan">registerrouter-link>
<transition mode="out-in">
<router-view>router-view>
transition>
div>
<script type="text/javascript">
var login={
// 通过this.$route可以拿到当前的路由的对象信息,而query中装的就是data,所以可以通过这样的方式,拿到传过来的值
template:"login{{this.$route.query.id}}{{this.$route.query.name}}
"
}
var register={
// 调用方法2,其中的属性体是params,而不是query
template:"register{{this.$route.params.id}}{{this.$route.params.name}}
"
}
var router = new VueRouter({
routes:[
{path:'/login',component:login},
{path:'/register/:id/:name',component:register}
],
linkActiveClass:'myactive'
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
head>
<body>
<div id="app">
<router-link to="/index">打开父亲路由router-link>
<router-link to="/index/login">登陆路由router-link>
<router-link to="/index/register">注册路由router-link>
<router-view>router-view>
div>
<template id="parent">
<div>
父亲组件
<router-view>router-view>
div>
template>
<script type="text/javascript">
var index={
template:"#parent"
}
var login={
template:"login
"
}
var register={
template:"register
"
}
var router=new VueRouter({
routes:[
{
path:'/index',
component:index,
// 写上这个标签,才能有子路由的对应路径,而且要注意,这里的path前面不能加'/',否则就不会将父路由的路径加进去
children:[
{path:'login',component:login},
{path:'register',component:register}
]
}
]
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
head>
<body>
<div id="app">
<router-view name="header">router-view>
<router-view name="left">router-view>
<router-view name="main">router-view>
div>
<template id="header">
<div>headerdiv>
template>
<template id="left">
<div>leftdiv>
template>
<template id="main">
<div>maindiv>
template>
<script type="text/javascript">
var header={
template:"#header"
}
var left={
template:"#left"
}
var main={
template:"#main"
}
var router=new VueRouter({
routes:[
// 需要指明的是,当改变为当前的路由的时候,哪个坑需要变化,需要变化为哪个
// 同时,component属性变为了components需要注意
{path:'/',components:{'header':header,'left':left,'main':main}}
]
})
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
router:router
})
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
<script type="text/javascript" src="./lib/vue-router.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="firstname" v-on:keyup="getnamebykeyup">input>
+
<input type="text" v-model="lastname" v-on:keyup="getnamebykeyup">input>
=
<input type="text" v-model="fullname">input>
<hr>
<input type="text" v-model="firstname">input>
+
<input type="text" v-model="lastname">input>
=
<input type="text" v-model="fullname">input>
<hr>
<input type="text" v-model="firstname">input>
+
<input type="text" v-model="lastname">input>
=
<input type="text" v-model="realname">input>
<hr>
<router-view>router-view>
div>
<template id="index">
<div>
index
<router-link to="/index/login" tag="a">loginrouter-link>
<router-link to="/index/register" tag="a">registerrouter-link>
<router-view tag="a">router-view>
div>
template>
<template id="login">
<div>logindiv>
template>
<template id="register">
<div>registerdiv>
template>
<script type="text/javascript">
var index={
template:'#index'
}
var login = {
template:'#login'
}
var register = {
template : "#register"
}
var router = new VueRouter({
routes:[
{path:'/',component:index},
{
path:'/index',
component:index,
children:[
{path:"login",component:login},
{path:"register",component:register}
]
}
]
})
var vm=new Vue({
el:'#app',
data:{
firstname:'',
lastname:'',
fullname:''
},
methods:{
getnamebykeyup(){
this.fullname = this.firstname+"--" +this.lastname
}
},
router:router,
watch:{
//相当于只要是这个名字的值发生了变化,就会触发事件
// 监视数据变化,其中的newvar和oldvar是默认的参数
'firstname':function(newvar,oldvar){
this.fullname = newvar+"--" +this.lastname
},
'lastname':function(newvar,oldvar){
this.fullname = this.firstname + "--" + oldvar
},
// 监视路由的地址改变
'$route.path':function(newvar,oldvar){
console.log(newvar+"-------------"+oldvar)
}
},
computed:{
// 直接当作属性使用,不需要再data中声名
// 只要其中牵涉到的数据发生了改变,就会触发这个函数
// 同时,不用管页面上到底有几个引用这个参数的地方,只需要知道,这个函数每次修改永远只会执行一遍
realname:function(){
return this.firstname+"-"+this.lastname
}
}
})
script>
body>
html>
npm i nrm -g //全局安装nrm,可以更换镜像源
nrm ls //查看源列表
nrm use npm //改变使用的源,下载依旧使用npm
npm install [email protected] -g //全局安装cnpm,指定3的。学会以后,变动可以查看官方文档
-webpack文件夹
--dist文件夹
--src文件夹
--css文件夹
--images文件夹
--js文件夹
--inidex.html文件
--main.js文件
npm i jquery -s
cnpm init -y
cnpm init // 通过这一句来生成基础目录的package.json文件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="../dist/bundle.js">script>
head>
<body>
<ul>
<li>这是第1个lili>
<li>这是第2个lili>
<li>这是第3个lili>
<li>这是第4个lili>
<li>这是第5个lili>
<li>这是第6个lili>
<li>这是第7个lili>
<li>这是第8个lili>
<li>这是第9个lili>
<li>这是第10个lili>
ul>
body>
html>
// 这是main.js,是我们项目的js文件入口
import $ from 'jquery'
$(function(){
$('li:odd').css('backgroundColor','green')
$('li:even').css('backgroundColor','red')
})
webpack .\src\main.js .\dist\bundle.js
const path = require('path')
module.exports = {
// 为了不使用以下命令,进行了配置,可以不再输入来源和目的地.而是仅仅输入webpack即可
// 原命令:webpack 原路径 目标路径
// 新命令:webpack
// 1.webpack发现命令中没有源文件和目标输出文件
// 2.然后就去根目录下面找配置文件
// 3.解析配置文件,得到配置对象
// 4.根据配置对象,进行语句拼接,然后构建项目
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
}
}
// 1、全局安装cnpm,因为npm直接装webpack-dev-server不成功,我也不知道为什么
npm i cnpm -g
// 2、安装webpack-dev-server到本地的项目开发依赖中
cnpm i webpack-dev-server -D
// 3、如果想要正常运行,需要在本地项目中安装对应的webpack.注意是本地,全局安装过也没有用。本地本地本地
cnpm i webpack
// 4、注意,想要正常运行的话还需要配置package.json,因为装的不是全局包,所以是不可以直接运行的,需要用下面的配置
// 5、在项目根路径下面,使用语句启动
npm run dev
// 6、修改index.html的js引用路径
// 结论1:最终会自动地将我们的项目发布到localhost:8080上面
// 结论2:自动的读取了配置文件,获取了输入和输出的路径
// 结论3:已经自动的将bundle.js以一种虚拟的形式托管到了项目根路径下面,所以可以直接使用localhost:8080/bundle.js
// 结论4:index.html中引用的bundle.js还是dist文件夹下面的
// 结论5:因为虚拟磁盘中的bundle.js可以实时刷新,所以将index.html中的引用文件路径改一下
// 结论6:不管他怎么生成,都只会给你一个虚拟内存中的bundle,永远不会有dist里面的,所以想要有还是要手动生成,但是项目已经可以不用执行语句就自动加载了
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
设置了这一条,因为webpack-dev-server我们不是全局安装的,所以不能被直接使用,只能这样来使用,运行的时候删除这行注释
"dev":"webpack-dev-server"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.5.0"
},
"devDependencies": {
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="/bundle.js">script>
head>
<body>
<ul>
<li>这是第1个lili>
<li>这是第2个lili>
<li>这是第3个lili>
<li>这是第4个lili>
<li>这是第5个lili>
<li>这是第6个lili>
<li>这是第7个lili>
<li>这是第8个lili>
<li>这是第9个lili>
<li>这是第10个lili>
ul>
body>
html>
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
--open 自动打开浏览器
--port 3000 启动的端口号
--contentBase src 设置项目的托管路径。所以,通过将index.html也虚拟放置一份在托管路径的方式,可以实现不论你将根目录设置在哪里,打开它都会自动启动你的index.html。和项目的任何路径都无关。写路经的时候照旧。
--hot 热部署,当只修改了css样式的时候可以不刷新页面,但是也做到了页面的样式变化。
--热部署中,如果修改了js代码,那么就会刷新页面,和没有热部署的效果一样,所以是看不出来。只有css样式单独发生变化的时候才可以看出区别
"dev":"webpack-dev-server --open --port 3000 --contentBase src --hot"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.5.0"
},
"devDependencies": {
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
}
}
const path = require('path')
// 第二步,获取webpack对象
const webpack = require('webpack')
module.exports = {
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
},
//修改webpack-dev-server的配置的第二种方式,前三项都是可以一步到位。但是热部署需要三步
devServer:{
open:true,
port:3000,
contentBase:'src',
// 第一步,设置为true
hot:true
},
plugins:[
// 第三步,使用这样子的一个热部署插件
new webpack.HotModuleReplacementPlugin()
]
}
const path = require('path')
const webpack = require('webpack')
// 1.先使用命令行安装一个插件 html-webpack-plugin
// cnpm i html-webpack-plugin -D
// 2.根据插件创建
const htmlWebpackPlugin=require('html-webpack-plugin')
module.exports = {
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
},
devServer:{
open:true,
port:3000,
contentBase:'src',
hot:true
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
// 第三步,新建对象.
new htmlWebpackPlugin({
template:path.join(__dirname,'./src/index.html'),
filename:'index.html'
})
// 结论1、此时已经可以根据plugins中的配置,创建一个对象,而这个对象代表了储存在内存中的index.html的文件位置
// 结论2、由于结论1中已经创建了一个index.html,所以自启动打开的项目的就是这个插件所生成的内存中的首页
// 结论3、在内存中的页面,会根据之前的配置自动地引入我们配置好的生成的内存中的js文件,所以我们可以不再手动的引入js文件,即删除index.html中引入文件的部分
]
}
const path = require('path')
const webpack = require('webpack')
const htmlWebpackPlugin=require('html-webpack-plugin')
// 1、使用cnpm i style-loader css-loader -D的方式安装loader插件
module.exports = {
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
},
devServer:{
open:true,
port:3000,
contentBase:'src',
hot:true
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
new htmlWebpackPlugin({
template:path.join(__dirname,'./src/index.html'),
filename:'index.html'
})
],
module:{// 2、使用这两个插件
rules:[
//正则表达式,用来识别无法识别的文件类型
{test:/\.css/,use:['style-loader','css-loader']}
]
}
}
import $ from 'jquery'
// 引入css文件即可
import './css/index.css'
// 使用过程:
// 1、发现这个文件不是js文件,然后就去配置文件中,查找有没有对应的第三方loader规则
// 2、如果找到了对应的规则,就使用对应的loader处理
// 3、再调用loader的时候,是从后往前调用的
// 4、当最后一个loader调用完毕,会把处理的结果,直接交给webpack进行打包合并,最终输出到bundle.js
$(function(){
$('li:odd').css('backgroundColor','white')
$('li:even').css('backgroundColor','black')
})
const path = require('path')
const webpack = require('webpack')
const htmlWebpackPlugin=require('html-webpack-plugin')
module.exports = {
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
},
devServer:{
open:true,
port:3000,
contentBase:'src',
hot:true
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
new htmlWebpackPlugin({
template:path.join(__dirname,'./src/index.html'),
filename:'index.html'
})
],
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
// 1、在webpack的项目中,如果是通过main.js中引入的文件中。里面的如果有对什么文件的路径索取,那么就必须要装好下面的这个插件。
// 2、命令为: cnpm i url-loader file-loader -D
// 3、然后进行下面的一个配置。具体例子用的是图片的,所以正则表达式是识别图片的
// 4、这样子配置完以后就可以加载css当中涉及到的url,也就可以正常的显示图片了,而图片名字是:'hash-图片原名字.图片原后缀'
// 5、由于会自动地将图片放到根目录下进行虚拟的托管,所以可以直接查看图片
// 6、但正是由于都放到了根目录下面,所以造成了所有图片都保存在了同一个目录下。
// 7、当设置的显示图片的名字为原名字.原后缀时。
// 8、你如果加载了两个文件夹中名字相同的图片,但是内容不相同的时候。那么就会自动的把两个图片设置为同一个名字,通通放置在我们的根目录下
// 9、所以就会出现,后加载的图片,覆写了前面一张图片。相当于之前加载的图片就没了。
// 10、为了解决这个问题,我们将源文件名字前面加上一个hash值,这样子就会出现重复的情况了
// 11、limit代表的是文件的大小,如果limit大于实际文件的大小,那么在页面上显示的时候就会显示base64的字符串地址
// 12、如果limit小于或者等于实际文件的大小的时候,那么在页面显示的地址就是普通地址
{test:/\.(png|jpg|gif|jpeg)$/,use:'url-loader?limit=75&name=[hash:8]-[name].[ext]'}
]
}
}
const path = require('path')
const webpack = require('webpack')
const htmlWebpackPlugin=require('html-webpack-plugin')
module.exports = {
entry:path.join(__dirname,'./src/main.js'),
output:{
path:path.join(__dirname,'./dist'),
filename:'bundle.js'
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
new htmlWebpackPlugin({
template:path.join(__dirname,'./src/index.html'),
filename:'index.html'
})
],
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.(png|jpg|gif|jpeg)$/,use:'url-loader?limit=75&name=[hash:8]-[name].[ext]'},
// 先下载一个bootstrap,因为其中的css当中有一部分会有引用到字体文件
// 当需要使用到字体文件的时候,需要创建新的loader,但是其中使用的loader就是我们加载图片的加载器
// 在main.js中引入bootstrap的字体
{test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'}
]
}
}
先查看自己编写的文件的具体位置,以此为原点
../为父级目录
./为当前目录
/为根目录
从main.js中想要引用node_modules中的bootstrap中的css文件时路径应该为
找到父级目录的node_modules中的[email protected]@bootstrap中的dist中的css中的bootstrap.css文件
../node_modules/[email protected]@bootstrap/dist/css/bootstrap.css
而想要引用index.css时,路径应该为
找到当前路径的src文件夹中的css文件夹中的index.css文件
./src/css/index.css
class Person{
static info = {
name : "张三",
age : 20
}
};
console.log(Person.info);
// 首先,为了引入这样的高级语法,我们必须要引入babel
// 引入babel的过程
// 1、首先下好babel需要的所有的依赖
// cnpm i @babel/core @babel/preset-env @babel/plugin-proposal-class-properties babel-loader -D
// 2、在webpack.config.js文件中,加入对babel-loader的引用
// 3、在项目根路径下创建.babelrc文件,写上下好的插件和预设
const path = require('path')
module.exports = {
entry : path.join(__dirname,'./src/main.js'),
output : {
path : path.join(__dirname,'./dist'),
filename : 'bundle.js'
},
module:{
rules:[
// 一定要去除node_modules文件夹
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/}
]
}
}
{
"presets":["@babel/preset-env"],
"plugins":["@babel/plugin-proposal-class-properties"]
}
//这是用到的所有babel和webpack相关的版本信息
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev":"webpack-dev-server --open --port 3000 --contentBase src --hot"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/preset-env": "^7.9.5",
"babel-loader": "^8.1.0",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
<script type="text/javascript" src="./lib/vue.min.js">script>
head>
<body>
<div id="app">
div>
<template id="temp">
<h3>哈哈哈哈哈哈哈哈哈哈h3>
template>
<script type="text/javascript">
var templates = {
template : "#temp"
}
var vm=new Vue({
el:'#app',
data:{
},
methods:{
},
// 使用渲染,可将模板的html代码返回,直接替换掉vue实例控制的html控件。将内容直接进行一个替换。
// 所以在真正的html页面上,就不存在了,直接被替换为了template中的html代码
render:function(createElements){
return createElements(templates);
}
})
script>
body>
html>
// 为了引用Vue 首先 我们在npm中需要下载安装vue
// cnpm i vue -S
// 然后使用下面的代码加载vue的时候 我们发现了不对劲 因为根据提示得知 我们导入的vue是个残缺的vue 不是我们想要的vue
// import Vue from 'vue'
// 这里牵扯到了包的搜索机制
// 首先 我们会去找到一个叫做node_modules的文件夹
// 然后在里面找到对应的vue文件夹
// 然后找到package.json文件
// 然后根基文件中的main指示 引入对应的vue包 这就是全过程 因为引入的是残缺的包 所以我们需要把路径改一改
// 方法有以下三种
// 1、直接改变下载来的vue中的main属性 指向我们需要的文件(但是不推荐 太low了)
// 2、修改当前文件中的导入路径 直接指明路径 自定义 但是还是不够优雅
// import Vue from '../node_modules/vue/dist/vue.js'
// 3、修改webpack.config.js中的配置 当要加载以vue结尾的东西的时候 我们就按照指定的文件位置去加载
import Vue from 'vue'
var vm=new Vue({
el:'#app',
data:{
msg:"123"
}
})
const path = require('path')
module.exports = {
entry : path.join(__dirname,'./src/main.js'),
output : {
path : path.join(__dirname,'./dist'),
filename : 'bundle.js'
},
module:{
rules:[
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/}
]
},
resolve:{
// 设置加载的路径 同时不用理会node_modules文件夹
alias:{
'vue$':'vue/dist/vue.js'
}
}
}
// 当仅仅只是加载runtime-only的时候 如果我们要使用渲染组件 那我们只能使用render 否则都会报错
import Vue from 'vue'
// 建议将模板函数写道一个单独的文件里面
// 然后就需要一个新的loader否则是无法加载的
// cnpm i vue-loader vue-template-compiler -D
// 在webpack.config.js中添加规则 完成以后就可以解析vue文件了
import login from './login.vue'
// 但是 如果你的vue-loader的版本是大于15的 需要参考官方文档 来更新webpack.config.js中的配置
// 而这个配置中涉及到的插件是无需下载的 因为在下载vue的时候就下载好了
var vm=new Vue({
el:'#app',
data:{
},
// 当引用的vue文件是残缺版的时候 只能通过render函数来渲染组件
render:function(createElements){
return createElements(login);
}
})
const path = require('path')
// 引入插件
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
entry : path.join(__dirname,'./src/main.js'),
output : {
path : path.join(__dirname,'./dist'),
filename : 'bundle.js'
},
module:{
rules:[
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/},
// 使用这个loader
{test:/\.vue$/,use:'vue-loader'}
]
},
plugins:[
// 使用这个插件
new VueLoaderPlugin()
]
}
render模块
import Vue from 'vue'
// 当使用import * from *或者import *的时候 可以获取该js文件中向外暴露的内容
// 比如这里 我们在vue文件中的script标签中写一个export default{} 然后就能将其中的内容进行一个暴露
// 而我们获取其中的方法如下所示 获取data()中的返回值的msg 还有methods方法中的show()方法
// 因为他不用设置名字 所以每一个文件中能够使用export default的次数都只有一次 不然的话不知道你要获取的暴露内容是哪些
// 但如果你使用export {精确标 as 你想要设置的属性名字}的时候 就可以使用无限多个 如下
import login,{title as planet,animal} from './login.vue'
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
// 这里的login 我们照样可以拿过来当作template使用的
return createElements(login);
}
});
// 这只是为了暴露数据和方法 单纯拿到对应的数据和方法
console.log(login.data().msg+"------"+login.methods.show());
console.log(planet+"-----------"+animal)
render模块
import Vue from 'vue'
import login from './login.vue'
// 1 先使用cnpm下载安装vue-router
// cnpm i vue-router -S
// 2 导入对应的文件
import VueRouter from 'vue-router'
import router1 from './router1.vue'
import router2 from './router2.vue'
// 3 在Vue中导入VueRouter
Vue.use(VueRouter)
// 4 创建router实例
var router = new VueRouter({
routes:[
{path:'/router1',component:router1},
{path:'/router2',component:router2}
]
})
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
return createElements(login);
},
// 5 引入router 因为是用render渲染的 所以router的坑需要放到render渲染的模板文件中去 避免被render删除而不显示出来
router:router
});
下面的两个模板只是单纯的模板文件没有必要记录 和这个文件一模一样 只是少了相关router的代码
router1模板
router2模板
import Vue from 'vue'
import login from './login.vue'
import VueRouter from 'vue-router'
import router1 from './router1.vue'
import router2 from './router2.vue'
// 1 引入子组件模板
import son1 from './son1.vue'
import son2 from './son2.vue'
Vue.use(VueRouter)
var router = new VueRouter({
routes:[
{
path:'/router1',
component:router1,
children:[
// 2 直接写好子组件的模板
// 3 然后在其当前组件的父组件中写上对应的router标签即可
{path:'son1',component:son1},
{path:'son2',component:son2},
]
},
{path:'/router2',component:router2}
]
})
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
return createElements(login);
},
router:router
});
router1模板.在承接上一案例的情况下,引入当前的子路由
son1
son2
router1模板
son1
son2
import Vue from 'vue'
import login from './login.vue'
import VueRouter from 'vue-router'
import router1 from './router1.vue'
import router2 from './router2.vue'
import son1 from './son1.vue'
import son2 from './son2.vue'
// 1 安装mint-ui
// cnpm i mint-ui -S
// 2 引入mint-ui
import MintUI from 'mint-ui'
// 3 导入css文件
import 'mint-ui/lib/style.css'
// 4 向Vue中安装MintUI
Vue.use(MintUI)
// 5 然后就可以直接在页面中使用MintUI组件了 想要什么组件可以查看MinutUI官网的中文文档 http://mint-ui.github.io/#!/en
Vue.use(VueRouter)
var router = new VueRouter({
routes:[
{
path:'/router1',
component:router1,
children:[
{path:'son1',component:son1},
{path:'son2',component:son2},
]
},
{path:'/router2',component:router2}
]
})
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
return createElements(login);
},
router:router
});
default
import Vue from 'vue'
import login from './login.vue'
import VueRouter from 'vue-router'
import router1 from './router1.vue'
import router2 from './router2.vue'
import son1 from './son1.vue'
import son2 from './son2.vue'
import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'
Vue.use(MintUI)
Vue.use(VueRouter)
// 使用MUI
// 安装MUI的包 类似于Bootstrap的使用方法 但是我们不能直接使用npm或者cnpm的方式去下载 因为他不支持
// 所以我们需要去GitHub上下载对应的文件 https://github.com/dcloudio/mui
// 将下载过来的文件的dist文件夹整个移动到我们的src目录下面的lib文件夹里面
// 这个lib文件夹专门放置无法从npm或者cnpm下载的包
// 然后导入这个文件
// 然后就可以直接使用MUI的样式了
// 具体样式可以参考GitHub上给出的例子 用法如同bootstrap和layui
import './lib/MUI/css/mui.min.css'
var router = new VueRouter({
routes:[
{
path:'/router1',
component:router1,
children:[
{path:'son1',component:son1},
{path:'son2',component:son2},
]
},
{path:'/router2',component:router2}
]
})
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
return createElements(login);
},
router:router
});
import Vue from 'vue'
import login from './login.vue'
import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'
Vue.use(MintUI)
import './lib/MUI/css/mui.min.css'
// 1 照样还要引入VueRouter 为了可以在Vue中安装Vue
import VueRouter from 'vue-router'
// 2 在Vue中使用VueRouter
Vue.use(VueRouter)
// 3 导入抽离的文件 将这个导入的对象作为原来的router来使用
import router from './router.js'
var vm=new Vue({
el:'#app',
data:{
},
render:function(createElements){
return createElements(login);
},
router:router
});
// 1 引入VueRouter
import VueRouter from 'vue-router'
// 2 引用我们设置的路由文件
import router1 from './router1.vue'
import router2 from './router2.vue'
import son1 from './son1.vue'
import son2 from './son2.vue'
// 3 创建路由对象
var router = new VueRouter({
routes:[
{
path:'/router1',
component:router1,
children:[
{path:'son1',component:son1},
{path:'son2',component:son2},
]
},
{path:'/router2',component:router2}
]
})
// 4 将路由对象暴露出去
export default router
链接:https://pan.baidu.com/s/1AZWfuiIuxOQDRJkypFz8bg
提取码:fpm5