Vue(適合移動端的項目必逆,特點小巧蘸际,不兼容ie)
https://cn.vuejs.org(官網(wǎng))
基礎代碼(聲明式渲染)
Vue.js 的核心是一個允許采用簡潔的模板語法來聲明式地將數(shù)據(jù)渲染進 DOM 的系統(tǒng):
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<body>
<div id="app">
{{message}}
</div>
<script>
window.onload= function () {
var app=new Vue({
el:'#app',
data:{
message:'Hellobejing'
}
})
}
</script>
</body>
</html>
我們已經成功創(chuàng)建了第一個 Vue 應用球及!看起來這跟渲染一個字符串模板非常類似竹捉,但是 Vue 在背后做了大量工作∷腔現(xiàn)在數(shù)據(jù)和 DOM 已經被建立了關聯(lián)豪直,所有東西都是響應式的雇逞。我們要怎么確認呢荤懂?打開你的瀏覽器的 JavaScript 控制臺 (就在這個頁面打開),并修改 app.message 的值喝峦,你將看到上例相應地更新势誊。
除了文本插值,我們還可以像這樣來綁定元素特性:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<body>
<div id="app">
<span v-bind:title="message">//簡寫v-bind:title 可以寫成:title
鼠標懸停此處查看動態(tài)綁定提示信息
</span>
</div>
<script>
var app=new Vue({
el:'#app',
data:{
message:'頁面加載于'+new Date().toLocaleString()
}
})
</script>
</body>
</html>
//class宇style是特例 兩者綁定的方式相同舉例如下(注意復合樣式谣蠢,采用駝峰命名法)
//第一種方法
data:{
c:{color:'red'},
b:{backgroundColor:'blue'}
}
<p :style="[c,b]">文字</p>
//第二種方法
data:{
json:{
color:'red',
backgroundColor:'green'
}
}
<div class="box">
<p :style="json">這是個文字</p>
</div>
這里我們遇到了一點新東西粟耻。你看到的 v-bind 特性被稱為指令查近。指令帶有前綴 v-,以表示它們是 Vue 提供的特殊特性挤忙∷可能你已經猜到了,它們會在渲染的 DOM 上應用特殊的響應式行為册烈。在這里戈泼,該指令的意思是:“將這個元素節(jié)點的 title 特性和 Vue 實例的 message 屬性保持一致”。
雙向數(shù)據(jù)綁定
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<body>
<div id="box">
<input type="text" v-model="msg">
<br/>
{{msg}}
</div>
</body>
<script>
window.onload= function () {
var vm=new Vue({
el:'#box',//可以掛在到Class 或者id選擇器或者標簽
data:{
msg:'寶劍鋒從磨礪出赏僧,梅花香自苦寒蘭'
}
})
}
</script>
</html>
結合案例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="box"></div>
<script>
var vm=new Vue({
el:'#box',
template:`
<div>
<ul>
<li>{{text1}}</li>
<li>{{text2}}</li>
</ul>
<input type="text" v-model="text2">
</div>
`,
data:{
text1:'abc',
text2:'123'
}
})
</script>
</body>
</html>
v-for
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<div>
數(shù)組
<ul>
<li v-for="(hero,index) in heros" :key="index">
{{hero.name}} {{index}}
</li>
</ul>
對象
<ul>
<li>值 | key | 索引</li>
<li v-for="(value,key,index) in person ":key="index">
{{value}}{{key}}{{index}}
</li>
</ul>
</div>
`,
data: function () {
return{
heros:[{id:1 , name:'小京京'},{id:2 , name:'小凱文'},{id:3 , name:'小寶寶'}],
person:{
a:1,
b:2
}
}
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
//vue是根據(jù)當前指定值使用一定的算法大猛,計算,算出一個元素的唯一標識淀零,給定key挽绩,則節(jié)省了運算標識的消耗.
處理用戶輸入
為了讓用戶和你的應用進行交互,我們可以用 v-on 指令添加一個事件監(jiān)聽器驾中,通過它調用在 Vue 實例中定義的方法:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script>
window.onload= function () {
var app=new Vue({
el:'.box',
data:{
msg:'helloword'
},
methods:{
reversemsg:function(ev){
this.msg=this.msg.split('').reverse().join(''),
console.log(ev.clientX)
}
}
})
}
</script>
<body>
<div class="box">
<p>{{msg}}</p>
<button v-on:click="reversemsg($event)">反轉信息</button> //v-on:click可以簡寫成為@click
//@click.stop(阻止冒泡) 或者ev.cancelBubble=true;
//@click.prevent(阻止默認事件)或者ev.preventDefault();
</div>
</body>
</html>
鍵盤事件
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script>
window.onload= function () {
var app=new Vue({
el:'.box',
data:{
msg:''
},
methods:{
show:function(ev){
alert("回車鍵被敲擊了")
}
}
})
}
</script>
<body>
<div class="box">
<input type="text" @keyup.13="show">
//@keydown.enter 后面可以是鍵碼或者是具體的名稱
</div>
</body>
</html>
模板
一次性綁定 v-once
<div id="app">
<p v-once>{{once}}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
once: 'once content'
}
});
app.once = 'changed content';
</script>
不進行 html 轉義
<div id="app">
<p v-html="html">不轉義的綁定(直接輸出 html)</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
html: '<div>div element</div>'
}
});
</script>
render屬性
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<div>
<ul>
<li>{{text1}}</li>
<li>{{text2}}</li>
</ul>
</div>
`,
data: function () {
return{
text1:'abc',
text2:'123'
}
}
}
new Vue({
el:'#app',
render:function(createElement){
return createElement(App);
}
})
//簡潔版1
// new Vue({
// el:'#app',
// render:function(c){
// return c(App);
// }
// })
//簡潔版2
// new Vue({
// el:'#app',
// render: c => c(App)
// })
</script>
</body>
</html>
//var App= {};等同于 var App=Vue.extend ({});(語法糖)
v-text
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<span v-text="vtext"></span>
`,
data: function () {
return{
vtext:'<h1>快樂老家</h1>'
}
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
//元素的innerText 唉堪,只能是雙標簽,不會解析標簽
v-html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<span v-html="vhtml"></span>
`,
data: function () {
return{
vhtml:'<h1>快樂老家</h1>'
}
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
//元素的innerHtml 肩民,只能是雙標簽 唠亚, 會解析標簽
v-if與v-else
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<p v-if="isAble">這段話不會存在</p>
<p v-else>這段話會存在</p>
`,
data: function () {
return{
isAble:false
}
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
漂亮的列表案例
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.sss{
background-color: mediumvioletred;
}
.ss{
background-color: cadetblue;
}
.s{
background-color: black;
}
</style>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var App={
template:`
<div>
排名顏色
<ul>
<li v-for="(hero,index) in heros" :key="heros.id" :class="{SSS:'sss',SS:'ss',S:'s'} [hero.level]">
{{hero.name}} {{hero.level}}
</li>
</ul>
奇偶變色
<ul>
<li v-for="(hero,index) in heros" :key="heros.id" :class="index%2==0?'sss':'s'">
{{hero.name}} {{hero.level}}
</li>
</ul>
`,
data: function () {
return{
heros:[{id:1 , name:'小京京',level:'SSS'},
{id:2 , name:'小凱文',level:'S'},
{id:3 , name:'小寶寶',level:'SS'}],
}
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
// 在做:class 就等于v-bind:class
- 在內部就可以隨意的獲取data下面的屬性,從而來做判斷
* 設置了一個`{變量值:'樣式1',變量值:'樣式2'}[hero.level]`
* class:
- 取其一
+ 三元表達式持痰,最終返回字符串
+ 從對象中通過key去取值灶搜,最終返回字符串
- 取多個樣式 (樣式1 樣式2)
+ 對象的方式 `{樣式1:true,樣式2:true}`
components
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<script type="text/javascript"></script>
<body>
<div id="app"></div>
<script>
var Header={
template:`
<div style="background-color:red; height: 200px">
</div>
`
}
var Body={
template:`
<div style="background-color:greenyellow; height: 400px">
</div>
`
}
var Footer={
template:`
<div style="background-color:blanchedalmond; height: 100px">
</div>
`
}
var App={
template:`
<div>
<header-vue></header-vue>
<body-vue></body-vue>
<footer-vue></footer-vue>
</div>
`,
components:{
'header-vue':Header,
'body-vue':Body,
'footer-vue':Footer
}
}
new Vue({
el:'#app',
render: function (c) {
return c(App);
}
})
</script>
</body>
</html>
webpack(打包工具)
webpack 入口文件 出口文件
`webpack ./main.js ·/build.js`
webpack模塊化開發(fā)
項目目錄
代碼結構
index.html代碼
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="../vue.js"></script>
<script src="./build.js"></script>
</body>
</html>
main.js代碼
//啟動vue
var Vue = require('../vue.js');
var App= require('./App.js');
new Vue({
el:'#app',
render:c=>c(App)
})
App.js代碼
/ /入口組件
var HeaderVue=require('./HeaderVue.js');
var BodyVue=require('./BodyVue.js');
var FooterVue=require('./FooterVue.js');
module.exports = {
template:`
<div>
<header-vue></header-vue>
<!--我是App組件-->
<body-vue></body-vue>
<footer-vue></footer-vue>
</div>
`,
components:{
'header-vue':HeaderVue,
'body-vue':BodyVue,
'footer-vue':FooterVue
}
}
Header代碼
//頭組件
module.exports = {
template:`<div style="background-color:red;height:150px">
我是頭
</div>`
}
Body代碼
//中間組件
module.exports = {
template:`<div style="background-color:yellowgreen;height:400px">
我是主體內容,新聞聯(lián)播共啃,現(xiàn)在開始......
</div>`
}
Footer代碼
//底部組件
module.exports= {
template:`<div style="background-color:skyblue;height:150px">
版權所有占调、違者必究
</div>`
}
//首先安裝webpack 首先命令行cd到當前目錄下,使用npm命令行安裝 webpack $npm i -g webpack 安裝成功之后進入到當前文件命令行移剪,
webpack ./main.js ./build.js 之后我們把引入的main文件換成build文件
·
代碼結構
index.html代碼
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="./build.js"></script>
</body>
</html>
main.js代碼
//啟動vue
var Vue = require('../vue.js');
var App= require('./App.js');
var Header=require('./HeaderVue.js')
var Body=require('./BodyVue.js')
var Footer=require('./FooterVue.js')
Vue.component('header-vue',Header);
Vue.component('body-vue',Body);
Vue.component('footer-vue',Footer);
new Vue({
el:'#app',
render:c=>c(App)
})
App.js代碼
/ /入口組件
module.exports = {
template:`
<div>
<header-vue></header-vue>
<!--我是App組件-->
<body-vue></body-vue>
<footer-vue></footer-vue>
</div>
`
}
Header代碼
//頭組件
module.exports = {
template:`<div style="background-color:red;height:150px">
我是頭
</div>`
}
Body代碼
//中間組件
module.exports = {
template:`<div style="background-color:yellowgreen;height:400px">
我是主體內容究珊,新聞聯(lián)播,現(xiàn)在開始......
</div>`
}
Footer代碼
//底部組件
module.exports= {
template:`<div style="background-color:skyblue;height:150px">
版權所有纵苛、違者必究
</div>`
}
//每次修改東西之后需要重新build
父向子傳遞值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script src="./vue.js"></script>
<body>
<div id="app"></div>
<script>
//子組件
var SubVue={
template:`
<span>{{msg}}</span>
`,
props:['msg']
}
//全局組件
Vue.component('sub-vue',SubVue);
//父組件
var App={
template:`
<div>
<sub-vue msg="我是中國人(父組件傳遞)"></sub-vue>
<sub-vue :msg="letter"></sub-vue>
</div>
`,
data(){
return {
letter:'我愛你'
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
子向父傳遞值
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="../vue.js"></script>
<script type="text/javascript">
//App父 Sub 子
var Sub = {
template:`
<div style="background-color:yellowgreen">
我是子組件
<button @click="help">呼叫爹地</button>
</div>
`,
methods:{
help(){
//呼叫爸爸
// console.log(this);
this.$parent.$emit('helpme','路上有巫婆');
}
}
};
var App = {
template:`
<div style="background-color:hotpink">
我是父組件
<button @click="listen">孩子走啦剿涮,開始看電話</button>
<sub-vue></sub-vue>
</div>
`,
components:{
'sub-vue':Sub
},
methods:{
listen(){
var self = this;
//$on
//this 是實例 app
this.$on('helpme',function(msg){
console.log('寶寶說:'+msg);
console.log('抄家伙,沖出去');
console.log('不再聽電話了');
//關閉事件
self.$off('helpme');
});
//
//也可以只觸發(fā)一次
// this.$once('helpme',function(msg){
// console.log('寶寶說:'+msg);
// console.log('抄家伙攻人,沖出去');
// });
}
}
};
//啟動
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
增刪改查
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
</body>
<script src="../vue.js"></script>
<script>
var data=[
{id:'1',name:'黃忠'},{id:'2',name:'扁鵲'},{id:'3',name:'李元芳'}]
var Add={
template:`
<div>
<input type="text" v-model="id"><br/>
<input type="text" v-model="name"><br/>
<button @click="addHero">添加</button>
</div>
<button>刪除</button>
`,methods:{
addHero(){
data.push({
id:this.id,
name:this.name
})
}
},
data(){
return{
id:'',
name:''
}
}
}
var List={
template:`
<div>
<ul>
<li v-for="(hero,index) in heros" :key="index">
{{hero.name}}
<button @click="del(hero.id)">刪除</button>
</li>
</ul>
</div>
`,
data(){
return {
heros:data
}
},methods:{
del(id){
var index=data.findIndex(function (ele,index,arr) {
return ele.id==id;
});
data.splice(index,1);
}
}
}
var App={
template:`
<div>
我是App父組件
<list></list>
<add></add>
<button @click="change">更新</button>
</div>
`,
components:{
list:List,
add:Add
},methods:{
change(){
data[0].name='隨便啦'
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</html>
過濾器
Vue.js 允許你自定義過濾器取试,可被用于一些常見的文本格式化。過濾器可以用在兩個地方:雙花括號插值和 v-bind 表達式 (后者從 2.1.0+ 開始支持)怀吻。過濾器應該被添加在 JavaScript 表達式的尾部瞬浓,由“管道”符號指示:
創(chuàng)建 Vue 實例之前全局定義過濾器:(舉例首字母大寫過濾器)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<script src="./lib/vue%20(1).js"></script>
<body>
<div id="box">
{{msg|capitalize}}
</div>
<script>
Vue.filter('capitalize', function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
})
new Vue({
el:'#box',
data:{
msg:'helloworld'
}
})
</script>
</body>
</html>
·
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="../vue.js"></script>
<script>
var App={
template:`
<div>
<input type="text" v-model="msg">
{{msg | myfilter}}
</div>
`,
data(){
return{
msg:'123456'
}
},
filters:{
'myfilter': function (value) {
var newStr=value.split('').reverse().join('');
return newStr;
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
全局過濾器
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="../vue.js"></script>
<script>
var App={
template:`
<div>
<input type="text" v-model="msg">
{{msg | myfilter}}
</div>
`,
data(){
return{
msg:'123456'
}
}
}
Vue.filter('myfilter', function (value) {
var newStr=value.split('').reverse().join('');
return newStr;
})
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
watch
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="../vue.js"></script>
<script>
var App={
template:`
<div>
<input type="text" v-model="msg">
{{msg}}
<button @click="change">通過調用函數(shù)更改person.name</button>
{{person.name}}
</div>
`,
data(){
return{
msg:'123456',
person:{name:'jack'}
}
},
watch:{
'msg': function (newV,oldV) {
console.log("更改被監(jiān)視到了",newV)
},
'person':{
handler: function (newV,oldV) {
console.log("更改監(jiān)視",newV)
},
deep:true
}
},
methods:{
change(){
this.person.name="rose"
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
//監(jiān)視watch
//* 需求:
//- 監(jiān)視一個值的改變,頁面中的change事件
//* 監(jiān)視單個data中的屬性值的改變
//- 原始數(shù)據(jù)類型 watch:{ 屬性名:fn }
//- 引用數(shù)據(jù)類型 watch:{ 屬性名:{deep:true,handler:fn}
計算屬性
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="./../vue.js"></script>
<script>
var App={
template:`
<div>
<input type="text" v-model="n1">+
<input type="text" v-model="n2">*
<input type="text" v-model="rate">=
{{numResult.money}}
</div>
`,
data(){
return{
n1:0,
n2:0,
rate:0
}
},
computed:{
'numResult': function () {
return{
money:((this.n1-0)+(this.n2-0))*this.rate//-0把字符串拼接變成number值
}
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
生命周期
//生命周期
//* 實例:
// - 1: `new Vue()` vue的實例 (一個)
//- 2: 組件內的this對象,組件對象的實例 (多個)
//
//* 總結
//- beforeCreate 相比created數(shù)據(jù)還未初始化
//- created 相比mounted蓬坡,還未生成DOM
//+ 可以發(fā)起ajax請求猿棉,獲取數(shù)據(jù)磅叛,變更數(shù)據(jù),來做裝載
//- beforeMount
//- 裝載中萨赁。弊琴。。杖爽。敲董。生成DOM(包含數(shù)據(jù))
//- mounted
//+ 可以操作DOM
//- created用來操作數(shù)據(jù),mounted用來操作DOM
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="../vue.js"></script>
<script type="text/javascript">
// beforeCreate 創(chuàng)建之前(組件)
// created 創(chuàng)建之后
// beforeMount 裝載之前(數(shù)據(jù)) = template + data 結合 + 放置到目的地
// mounted 裝載之后
// 在正常順序下不會觸發(fā)的
// beforeUpdate 更新之前(組件數(shù)據(jù))
// updated 更新之后
// activated 激活(組件)
// deactivated 停用(組件)
// beforeDestroy 銷毀之前(組件)
// destroyed 銷毀之后(組件)
var App = {
data(){
return {
text:'hello'
}
},
// beforeCreate(){ //10歲
// console.log(this.text); //undefined ,此時沒有完成對數(shù)據(jù)的初始化
// // console.log('beforeCreate');
// },
created(){ //20歲
//console.log(this.text); //有數(shù)據(jù),可以操作數(shù)據(jù)
//this.text = '大家好'; //模擬ajax請求獲取數(shù)據(jù)
// console.log('created');
console.log(this.$refs.mydiv); //DOM還未生成,不能操作DOM
},
// beforeMount(){ //30歲
// console.log('beforeMount');
// },
mounted(){
//console.log('mounted');
console.log(this.$refs.mydiv); //可以操作DOM
},
template:`<div ref="mydiv">
我是App慰安,{{text}}
</div>`
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
獲取元素
* 1: 在template模板中元素上加上 ref="xxx"
* 2: 在函數(shù)腋寨、或者mounted鉤子函數(shù)中 獲取: this.$refs.xxx 元素
- 如果ref="xxx" 是寫在原生DOM元素上,獲取的就是原生DOM元素
- 如果ref="xxx" 是放在組件標簽上化焕,獲取的就是組件對象
內置組件
* keep-alive
- 可以將頻繁插入和移除的元素精置,進行緩存,而無需重復的創(chuàng)建和銷毀
- 其包裹的元素锣杂,就有這個效果,同時也會根據(jù)v-if不同的結果
- 觸發(fā) 激活和停用事件番宁,此2事件與 destroyed和created互斥
·
總結
* 事件的回調函數(shù) = 鉤子函數(shù)
* beforeCreate 創(chuàng)建之前(組件) 沒有完成數(shù)據(jù)的初始化
* created 創(chuàng)建之后元莫,可以操作數(shù)據(jù)(最佳) v-if="true"
* beforeMount 裝載之前(數(shù)據(jù)) = template + data 結合 + 放置到 目的地
* mounted 裝載之后,可以操作DOM,給dom元素添加一些事件, 修改某個DOM元素的顯示
* 在正常順序下不會觸發(fā)的
* beforeUpdate 更新之前(組件數(shù)據(jù)),盡量少用
* updated 更新之后,盡量少用
* activated 激活(組件)配合keep-alive內置組件來使用,將組 件數(shù)據(jù)緩存到js內存中
* deactivated 停用(組件)配合keep-alive內置組件來使用
* beforeDestroy 銷毀之前(組件) v-if="false"
* destroyed 銷毀之后(組件)
* 創(chuàng)建蝶押、激活 根據(jù)v-if="true"來決定
* 銷毀踱蠢、停用 根據(jù)v-if="false"來決定
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="../vue.js"></script>
<script type="text/javascript">
// beforeCreate 創(chuàng)建之前(組件)
// created 創(chuàng)建之后
// beforeMount 裝載之前(數(shù)據(jù)) = template + data 結合 + 放置到目的地
// mounted 裝載之后
// 在正常順序下不會觸發(fā)的
// beforeUpdate 更新之前(組件數(shù)據(jù))
// updated 更新之后
// activated 激活(組件)
// deactivated 停用(組件)
// beforeDestroy 銷毀之前(組件)
// destroyed 銷毀之后(組件)
var SubVue = {
template:`<div>
我是子組件
</div>`,
beforeDestroy(){
console.log('beforeDestroy');
},
destroyed(){ //殺豬 ,放豬
console.log('destroyed');
},
created(){ //買豬 棋电,關豬
console.log('created');
},
beforeCreate(){
console.log('beforeCreate');
},
activated(){
console.log('激活了activated');
},
deactivated(){
console.log('停用了deactivated');
}
}
//注冊全局組件
Vue.component('sub-vue',SubVue);
var App = {
data(){
return {
text:'hello',
isAble:true
}
}
// ,
//更新后茎截,不建議,做二次更新
// beforeUpdate(){
// console.log('beforeUpdate')
// },
// updated(){
// console.log('updated')
// }
,template:`<div ref="mydiv">
我是App赶盔,{{text}}
<button @click="change">更改Text的值</button>
<keep-alive>
<sub-vue v-if="isAble"></sub-vue>
</keep-alive>
<button @click="isAble = !isAble">銷毀或常見子組件</button>
</div>`
,methods:{
change(){
this.text = 'abc';
}
}
}
new Vue({
el:'#app',
render:c=>c(App)
})
</script>
</body>
</html>
vue-router
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<!-- 引1個包 -->
<script type="text/javascript" src="./build.js"></script>
</body>
</html>
//main.js
//引入Vue
var Vue = require('../vue.js');
//引入VueRouter
var VueRouter = require('../vue-router.js');
var App = require('./App.js');
//安裝插件
Vue.use(VueRouter); //掛載一些屬性企锌,供組件使用其功
//創(chuàng)建路由對象
var router = new VueRouter({
//配置路由規(guī)則
routes: [{
path: '/music',
component: { //組件內容,也可以引入
template: `
<div>
我是音樂于未,在人民廣場吃炸雞撕攒!
</div>
`
}
},{
path: '/movie',
component: { //組件內容,也可以引入
template: `
<div>
我是電影烘浦, 摔跤吧爸爸抖坪!
</div>
`
}
}]
});
//把路由對象交給vue
new Vue({
el:'#app',
router:router,
render:c=>c(App)
})
//App.js
module.exports = {
template:`
<div>
我是App主體
以下是變化的內容,留坑
<router-view></router-view>
</div>
`
}
router步驟
- 1: 引入對象
- `var VueRouter = require('vue-router/dist/vue-router.common.js');`
- 2: 安裝插件 `Vue.use(VueRouter);`
+ 會給this(組件對象掛載一些對象,具備一些功能)
- 3:創(chuàng)建路由對象 `var router3 = new VueRouter(路由規(guī)則);`
- 4:配置路由規(guī)則 `routes:[ {path:'/home',component:Home } ] `
- 5:將配置好規(guī)則的路由對象交給Vue的實例構造函數(shù)參數(shù)中
+ `new Vue({ router:router3 })`
- 6: 留坑 `<router-view></router-view>`
*
router-link
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//main.js
var Vue = require('vue/dist/vue.common.js');
var VueRouter = require('vue-router/dist/vue-router.common.js');
var App = require('./App.js');
var Home = require('./Home.js');
var Music = require('./Music.js');
var Movie = require('./Movie.js');
//安裝插件
Vue.use(VueRouter);
//創(chuàng)建路由對象
var router = new VueRouter({
routes:[
{ path:'/',component:Home }, //Home有頭中底
{ path:'/music',component:Music },
{ path:'/movie',component:Movie },
]
});
new Vue({
el:'#app',
router,
render:c=>c(App)
})
//App.js
module.exports = {
template:`
<div>
我是App
<router-view></router-view>
</div>
`
}
//home.js
module.exports = {
template:`
<div>
<div style="background-color:hotpink;">
<!-- <a href="#/music">音樂</a>
<a href="#/movie">電影</a>
-->
<router-link to="/music">音樂</router-link>
<router-link to="/movie">電影</router-link>
</div>
<div style="background-color:yellowgreen;">正在熱播....</div>
<div style="background-color:skyblue;">版權所有違者必究</div>
</div>
`
}
//music.js
module.exports = {
template:`
<div>
我是音樂
</div>
`
}
//movie.js
module.exports = {
template:`
<div>
我是電影
</div>
`
}
#### router-link
* vue-router內置組件,可以根據(jù)to的屬性生成a標簽及其href,讓我們不用擔心是#還 是#!等等等闷叉。擦俐。
* `<a href="#!/xxxx">xxx</a>`
* `<router-link to="/xxxx">xxx</router-link>`
router-named
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<!-- <router-link to="/music">音樂</router-link>
<router-link :to="{ name:'music' }" >音樂</router-link> -->
<div id="app"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//App.js
module.exports = {
template:`
<div>
我是App
<router-view></router-view>
</div>
`
}
//home.js
module.exports = {
template:`
<div>
<div style="background-color:hotpink;">
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
</div>
<div style="background-color:yellowgreen;">正在熱播....</div>
<div style="background-color:skyblue;">版權所有違者必究</div>
</div>
`
}
//main.js
module.exports = {
template:`
<div>
<div style="background-color:hotpink;">
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'music'} ">音樂</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
<router-link :to=" {name:'movie'} ">電影</router-link>
</div>
<div style="background-color:yellowgreen;">正在熱播....</div>
<div style="background-color:skyblue;">版權所有違者必究</div>
</div>
`
}
//mocie.js
module.exports = {
template:`
<div>
我是電影
</div>
`
}
//music.js
module.exports = {
template:`
<div>
我是音樂
</div>
`
}
#### 命名路由
* 通過name屬性去尋找路由規(guī)則,獲取其path屬性握侧,作為a標簽的href屬性
* 生成:
- 操作 `<router-link :to=" {name:'bj'} "` (去哪里玩呢?)
- 規(guī)則 ` { name:'bj',path:'/beijing',component:BeiJing} ` (導航)
- 生成 `根據(jù)name屬性找到對象蚯瞧,獲取path生成a的href`
+ `#/beijing`
* 減少維護URL的成本
#### 關于屬性賦值的總結
* 常量賦值: 不綁定屬性嘿期,直接給值 xxx='abc'
* 變量賦值: 綁定屬性 :xxx="變量名"
查詢字符串的顯示
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app"></div>
<script src="build.js"></script>
</body>
</html>
//App.js
module.exports={
template:`
<div>
<router-view></router-view>
</div>
`
}
//main.js
var Vue = require('vue/dist/vue.common.js');
var VueRouter = require('vue-router/dist/vue-router.common.js');
//通過加載的相對路徑獲取絕對路徑
// console.log( require.resolve('vue-router') );
var App = require('./App.js');
var List = require('./List.js');
var Detail = require('./Detail.js');
//安裝插件
Vue.use(VueRouter);
//創(chuàng)建路由對象
var router = new VueRouter({
routes:[
{ path:'/',component:List },
{ name:'detail',path:'/detail',component:Detail},
{ name:'detail2',path:'/detail2/test/:myid',component:Detail}
]
});
//啟動vue
new Vue({
el:'#app',
router,
render:c=>c(App)
})
//Detail.js
module.exports = {
template:`
<div>
我是詳情
</div>
`,
data(){
return {
text:''
}
},
// beforeCreate(){
// this.text = 'abc'; //undefined
// //獲取路由參數(shù),并顯示在頁面
// }
//完成數(shù)據(jù)觀察
created(){
console.log(this.$route.query);
// 1:去哪里 {name:'detail2',params:{myid:hero.id} }
//2:導航{ name:'detail2',path:'/detail2/test/:myid',component:Detail}
console.log(this.$route.params );
}
}
//List.js
module.exports = {
template:`
<div>
查詢字符串
<ul>
<li v-for="(hero,index) in heros" :key="hero.id" >
{{hero.name}} <router-link :to=" {name:'detail',query:{id:hero.id} } " >查看詳情</router-link>
</li>
</ul>
<hr/>
路徑方式
<ul>
<li v-for="(hero,index) in heros" :key="hero.id" >
{{hero.name}} <router-link :to=" {name:'detail2',params:{myid:hero.id} } " >查看詳情</router-link>
</li>
</ul>
</div>
`,
data(){
//干掉:function状知,this指向一致
return {
heros:[ {id:1,name:'小粑粑'} ,{id:2,name:'大雄'},{id:3,name:'胖虎'}]
}
}
}
多視圖
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//main.js
var Vue = require('../vue.js');
var VueRouter = require('../vue-router.js');
var App = require('./App.js');
var HeaderVue = require('./HeaderVue.js');
var BodyVue = require('./BodyVue.js');
var FooterVue = require('./FooterVue.js');
//全局組件
// Vue.component('header-vue',HeaderVue);
// Vue.component('body-vue',BodyVue);
// Vue.component('footer-vue',FooterVue);
//安裝插件
Vue.use(VueRouter);
//創(chuàng)建路由對象
var router = new VueRouter({
routes:[
{
path:'/',components: {
'a':FooterVue,
'b':HeaderVue,
'default':BodyVue
}
}
]
});
new Vue({
el:'#app',
router,
render:c=>c(App)
})
//App/jsmodule.exports = {
template:`
<div>
<router-view name="a"></router-view>
<router-view name="b"></router-view>
<router-view></router-view>
</div>
`,
}
//Header Body Footer
module.exports = {
template:`
<div>
頭部/中部/底部
</div>
`
}
#### 多視圖(命名視圖)
* 更為靈活的維護秽五,靈活的配置修改顯示的效果
* 區(qū)分component和components
- component填一個坑 組件對象
- components填多個坑 是一個對象`{坑名:組件}`
嵌套路由 與頁面的重定向和404
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//main.js
var Vue=require('../vue.js');
var VueRouter=require('../vue-router.js');
var App=require('./App.js');
var Home=require('./Home.js');
var Music=require('./Music.js');
var Movie=require('./Movie.js');
var NotFount=require('./NotFount.js')
Vue.use(VueRouter);
var router=new VueRouter({
routes:[
{path:'/',redirect:'/home'},//頁面的重定向 一開始默認進入頁面時顯示的頁面 redirect:'/home'
{path:'*',component:NotFount},//當頁面404的時候顯示的友好頁面
{name:'home',path:'/home',component:Home,
children:[
{name:'home.music',path:'music',component:Music},
{name:'home.movie',path:'movie',component:Movie}
]
}]
});
new Vue({
el:'#app',
router:router,
render:c=>c(App)
})
//App.js
module.exports = {
template:`
<div>
<router-view></router-view>
</div>
`
}
//Home.js
module.exports = {
template:`
<div>
歡迎來到首頁
<router-link :to="{ name:'home.music'}">音樂</router-link>
<router-link :to="{ name:'home.movie'}">電影</router-link>
<hr/>
<router-view></router-view>
</div>
`
}
//Movie/Music.js
module.exports = {
template:`
<div>
music / movie
</div>
`
}
//NOtFount.js
/**
* Created by Administrator on 2018/2/28.
*/
module.exports = {
template:`
<div>
您要找的頁面去旅行了
</div>
`,
}
#### 嵌套路由
* 案例
- 進入我的主頁顯示:電影、歌曲
* 1: 視圖包含視圖(保證坑)
* 2: 路由包含子路由 (錨點值)
- 父子路由都要映射組件 (顯示內容)
### 重定向及404
* 404:所有規(guī)則都匹配不上饥悴,最后一條生效
* 路由規(guī)則對象中坦喘,有屬性redirect
* `{ redirect:{ name:'xxx'} } ` 一般寫在規(guī)則的前面,跳轉的寫在其后面
編程導航
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//main.js
var Vue = require('vue/dist/vue.common.js');
var VueRouter = require('vue-router/dist/vue-router.common.js');
var App = require('./App.js');
var Home = require('./Home.js');
//安裝插件
Vue.use(VueRouter);
//創(chuàng)建路由對象
var router = new VueRouter({
routes:[
{ name:'home', path:'/home',component:Home},
]
});
new Vue({
el:'#app',
router,
render:c=>c(App)
})
//App.js
module.exports = {
template:`
<div>
<button @click="$router.go(1)">下一頁</button>
輸入: <input type="text" @change="change" v-model="hash" />
<router-view></router-view>
</div>
`,
methods:{
change(){
if(this.hash != '123456'){
//密碼錯誤西设,不給予跳轉
alert('操作失敯晗场!');
}else{
//$route 獲取信息 $router 行為操作
this.$router.push({
name:'home'
}); //改變錨點值贷揽,跳轉到/home
}
}
},
data(){
return {
hash:''
}
}
}
//home.js
module.exports = {
template:`
<div>
<button @click="goBack">返回默認頁</button>
我是首頁
</div>
`,
methods:{
goBack(){
//借助history歷史記錄
this.$router.go(-1);
}
}
}
#### 編程式導航
* 改變錨點 `this.$router.push({ name:'xx' })`
* 根據(jù)歷史記錄跳轉 `this.$router.go(-1||1);` 前進或后退
webpack:
使用配置文件設置出入口
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//main.js
var cal = require('./cal.js');
console.log(cal.add(8,7));
//cal.js
module.exports = {
add(n1,n2){
return n1 + n2;
}
}
//weboack.config.js
// 運行的環(huán)境是node
'use strict';
module.exports = {
//配置對象
entry:{//入口
//入口之一
'test1233':'./main.js'
},
//出口(產出)
output:{
//生成的js文件名
filename:'./build.js'
}
}
css-loader
首先我們在文件打開命令行 npm i css-loader style-loader -D
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//index.css
body{
background-color: yellowgreen;
}
//main.js
require('./index.css');
//webpack.config.js
module.exports = {
entry:{
'main':'./main.js'
},
output:{
filename:'./build.js'
},
//模塊棠笑,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
}
]
}
}
less-loader
首先我們在文件打開命令行 npm i less-loader less -D
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="build.js"></script>
</body>
</html>
//index.less
@color:skyblue;
body{
background-color: @color;
}
//main.js
require('./index.less');
//webpack.config.js
module.exports = {
entry:{
'main':'./main.js'
},
output:{
filename:'./build.js'
},
//模塊,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
},
{
test:/\.less$/,
loader:'style-loader!css-loader!less-loader',
}
]
}
}
解析文件
//首先我們 npm i url-loader file-loader -D
//webpack.cpnfig.js
module.exports = {
entry:{ //入口
'main':'./src/main.js'
},
output:{ //產出
path:'./dist', //輸出目錄 使用好像會報錯 現(xiàn)在不能用了好像
filename:'build.js' //js文件名
},
//模塊禽绪,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
},
{
test:/\.less$/,
loader:'style-loader!css-loader!less-loader',
},
{
//通過url-loader來依賴file-loader
//如果url-loader滿足條件蓖救,則將文件生成base64編碼
//如果url-loader不滿足條件,則新生成原文件
test:/\.(jpg|png|svg|ttf|gif)$/,
loader:'url-loader?limit=4096&name=[name].[ext]', //依賴file-loader內部由url來判斷調用
//limit=4096 資源再4096btye以下生成base64,以上則生成文件
//[name].[ext] 原名.原后綴名
}
]
}
}
//src/index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="build.js"></script>
</body>
//src/index.css
body{
background-image: url('./1.jpg');
}
//src/main.js
require('./index.css');
#### 處理文件 + base64
* 將文件以base64加密,好處:減少請求次數(shù)
* 圖片在經過加密后印屁,會在原大小基礎上循捺,增加三分之一左右
* 應用場景:
- 針對不大的圖片,而頻繁需要使用的場景
- 4096b 4kb
特殊符號
* 字符串內存在! 代表分隔多個
* 字符串內存在? 代表參數(shù) ?key=value&key=value
* 字符串內& 還是并且的意思
字符串內使用的內置變量
* 在字符串內使用`[name]` 文件的原名
* `[ext]` 文件原后綴名
* output:{}
- path 資源輸出路徑
- filename js文件名
html插件
//首先我們 npm i html -webpack-plugin -D
//然后再次npm i webpack -D
//webpack.config.js
'use strict';
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry:{ //入口
'main':'./src/main.js'
},
output:{ //產出
filename:'build.js' //js文件名
},
//模塊雄人,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
},
{
test:/\.less$/,
loader:'style-loader!css-loader!less-loader',
},
{
//通過url-loader來依賴file-loader
//如果url-loader滿足條件从橘,則將文件生成base64編碼
//如果url-loader不滿足條件,則新生成原文件
test:/\.(jpg|png|svg|ttf|gif)$/,
loader:'url-loader?limit=4096&name=[name].[ext]', //依賴file-loader內部由url來判斷調用
//limit=4096 資源再4096btye以下生成base64,以上則生成文件
//[name].[ext] 原名.原后綴名
}
]
},
plugins:[
//一堆插件中的一個础钠,第一個執(zhí)行
new htmlWebpackPlugin({
//參照模板
template:'./src/index.html'
})
]
}
#### 處理html
* npm i html-webpack-plugin -D
* 在配置文件中恰力,引入這個對象
* 在webpack配置對象的根屬性中,設置plugins:[ new 以上對象(options)]
* 插件數(shù)組元素的順序旗吁,與代碼的執(zhí)行順序一致
* `options:{ template:'./src/index.html' //參照物 }`
處理es6
//首先我們npm i babel-loader babel-core babel-preset-env babel-plugin-transform-runtime -D
//'use strict';
const htmlWebpackPlugin = require('html-webpack-plugin');
const path = require("path")
module.exports = {
entry:{ //入口
'main':'./src/main.js'
},
output:{ //產出
path:path.resolve("./dist"), //輸出目錄
filename:'build.js' //js文件名
},
//模塊踩萎,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
},
{
test:/\.less$/,
loader:'style-loader!css-loader!less-loader',
},
{
//通過url-loader來依賴file-loader
//如果url-loader滿足條件,則將文件生成base64編碼
//如果url-loader不滿足條件很钓,則新生成原文件
test:/\.(jpg|png|svg|ttf|gif)$/,
loader:'url-loader?limit=4096&name=[name].[ext]', //依賴file-loader內部由url來判斷調用
//limit=4096 資源再4096btye以下生成base64,以上則生成文件
//[name].[ext] 原名.原后綴名
},
//處理js
{
test:/\.js$/,
loader:'babel-loader',
//排除node_modules目錄
exclude:/node_modules/,
//設置語法預設驻民、函數(shù)插件
options:{
//處理語法部分
presets:['env'],//處理es2015/2016/2017語法部分
plugins:['transform-runtime'],//處理函數(shù)部分
}
}
]
},
plugins:[
//一堆插件中的一個,第一個執(zhí)行
new htmlWebpackPlugin({
//參照模板
template:'./src/index.html'
})
]
}
//main.js
let num = 1;
const num2 = 2;
let fn = ()=>{
return 1;
}
let num3 = Math.trunc(3.165);
console.log(num3);
new Promise(function(resolve,reject){
});
#### ES6
* const let Math.trunc
#### babel語法轉換器
* es6/es7/react
* 設置語法 es6
* 通過插件設置 轉換函數(shù)
* 通過webpack 將所有的js代碼履怯,進行轉換,babel-loader回还,其依賴于babel-core
* 語法babel-preset-es2015(babel-preset-env:包含了所有(es6/es7/es8) )
- es2015/es2016/es2017
* 函數(shù)babel-plugin-transform-runtime
* babel-loader babel-core babel-preset-env babel-plugin-transform-runtime
引入vue
//首先倒入依賴包 npm i vue-template-compiler vue-loader -D
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>單文件</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
//main.js
const Vue = require('vue/dist/vue.runtime.common.js');
//App組件
const App = require('./App.vue').default; //以vue結尾的加上default
// module.exports = { default:{xxxx} } = export default App;
// console.log(App); //{ default:組件的options }
new Vue({
el:'#app',
render:c=>c(App)
});
//app.css
#d1{
background-color: yellowgreen;
}
//正常app.js用來對比app.vue
// css
require('./app.css');
module.exports = {
//HTML
template:`
<div id="d1">
我是App.js組件
</div>
`,
//jS
created(){
console.log('我是App.js組件 ');
}
}
//app.vue
<style>
#d2{
background-color: skyblue;
}
</style>
<template>
<div id="d2">
我是app.vue組件
</div>
</template>
<script>
module.exports = {
created(){
console.log('我是app.vue組件')
}
}
</script>
//webpack.cpnfig.js
'use strict';
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry:{ //入口
'main':'./src/main.js'
},
output:{ //產出
path:'./dist', //輸出目錄
filename:'build.js' //js文件名
},
//模塊,對象
module:{
//一堆加載器 loaders
loaders:[
//解析css
{
//匹配條件 './index.css'
test:/\.css$/, //以.css結尾的文件
loader:'style-loader!css-loader',
//代碼順序是1,2 執(zhí)行順序 2,1,順序不要搞凡
},
{
test:/\.less$/,
loader:'style-loader!css-loader!less-loader',
},
{
//通過url-loader來依賴file-loader
//如果url-loader滿足條件叹洲,則將文件生成base64編碼
//如果url-loader不滿足條件柠硕,則新生成原文件
test:/\.(jpg|png|svg|ttf|gif)$/,
loader:'url-loader?limit=4096&name=[name].[ext]', //依賴file-loader內部由url來判斷調用
//limit=4096 資源再4096btye以下生成base64,以上則生成文件
//[name].[ext] 原名.原后綴名
},
//處理js
{
test:/\.js$/,
loader:'babel-loader',
//排除node_modules目錄
exclude:/node_modules/,
//設置語法預設、函數(shù)插件
options:{
//處理語法部分
presets:['env'],//處理es2015/2016/2017語法部分
plugins:['transform-runtime'],//處理函數(shù)部分
}
},
{
//處理vue
test:/\.vue$/,
loader:'vue-loader', //依賴vue-template-compiler
}
]
},
plugins:[
//一堆插件中的一個,第一個執(zhí)行
new htmlWebpackPlugin({
//參照模板
template:'./src/index.html'
})
]
}
#### 單文件方式
* 引包的方式(方式一)
- var 組件 = {}
* 淺嘗webpack
- 解析commonjs (組件 + 模塊的使用)
* 單文件方式(方式二)
- 以App.vue方式來編寫代碼 (結合webpack來編寫)
- 主流方式
* 注意 在引入.vue的文件的時候蝗柔,加上.default來獲取options對象
* 原因在于 在vue-loader中闻葵,默認是以ES6導出的,而我們以commonjs引入的癣丧,
* 由于webpack最終會把es6轉換成commonjs中的module.exports.default = App組件
總結
//index.html
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
//main.js
const Vue = require('../vue.js');
const VueRouter = require('../vue-routerjs');
// const VueRouter = require('vue-router').default;
//因為組件槽畔,是.vue文件,而其是被vue-loader加載胁编,又因為厢钧,vue-loader向外導出的方式是es6的模塊
//所以,我們require最終拿到的是 module.exports -> { default:對象 }
//ES6模塊導出代碼 export default 對象 嬉橙,es6模塊導出早直,就是一個對象,default是其中的屬性
const App = require('./App.vue').default;
const Home = require('./Home.vue').default;
//安裝插件
Vue.use(VueRouter);
//創(chuàng)建路由對象
let router = new VueRouter({
routes:[
{ path:'/',redirect:{ name:'home'} },
{ name:'home',path:'/home',component:Home }
]
});
new Vue({
el:'#app',
router,
render:c=>c(App)
})
//Home.vue
<template>
<div>
我是home首頁
</div>
</template>
<script>
module.exports = {
}
</script>
<style scoped>
/*讓樣式只在當前的Template中生效市框,可以在style上加上一個scoped*/
div{
background-color: hotpink;
}
</style>
//App.vue
<template>
<!-- 必須1個[根]節(jié)點 -->
<div>
我是app.vue啊啊啊
<router-view></router-view>
</div>
</template>
<script>
// 首先寫上導出
module.exports = {
}
</script>
<style scoped>
/*讓樣式只在當前的Template中生效霞扬,可以在style上加上一個scoped*/
div{
background-color: yellowgreen;
}
</style>
//webpack.config.js
'use strict';
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry:{
'main':'./src/main.js'
},
output:{
path:path.resolve('./dist'),
filename:'build.js'
},
module:{
loaders:[
//css
{
test:/\.css$/,
loader:'style-loader!css-loader'
},
//less
{
test:/\.less/,
loader:'style-loader!css-loader!less-loader'
},
//file
{
test:/\.(jpg|png|svg|gif)$/,
// loader:'url-loader?limit=4096&name=[name].[ext]'
loader:'url-loader',
options:{
limit:4096,
name:'[name].[ext]'
}
},
//js
{
test:/\.js$/,
loader:'babel-loader',
//排除掉node_modules
exclude:/node_modules/,
options:{
presets:['env'], //轉換語法關鍵字
plugins:['transform-runtime'] //轉換函數(shù)
}
},
//vue
{
test:/\.vue/,
loader:'vue-loader'
}
]
},
//html
plugins:[
new htmlWebpackPlugin({
template:'./src/index.html'
})
]
}