1. 程式人生 > 實用技巧 >vue框架之前後端互動等相關內容-112

vue框架之前後端互動等相關內容-112

0 購物車案例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>

<div id="box">

<input type="checkbox" v-model="isAll" @change="handleCheck"> 全選/全不選

<div></div>
<ul>
<!--<li v-for="item in datalist">商品名字:{{item.name}},商品數量:{{item.number}}</li>-->
<li v-for="item in datalist">
<input type="checkbox" :value="item" v-model="checkgroup" @change="handleOne">
{{item}}
<button @click="item.number++">增</button>
{{item.number}}
<button @click="handleJ(item)">減</button>
</li>
</ul>
<br>
當前價格是:{{getPrice()}}
<br>
{{checkgroup}}
</div>

</body>
<script>
var vm = new Vue({
el: '#box',
data: {
datalist: [
{name: '特斯拉', price: 10, number: 1, id: '1'},
{name: '蘋果', price: 3, number: 4, id: '2'},
{name: '香蕉', price: 80, number: 6, id: '3'}
],
checkgroup: [],
isAll:false,

},
methods:{
getPrice(){
var sum_price=0
for(i in this.checkgroup){
sum_price+=this.checkgroup[i]['number']*this.checkgroup[i]['price']
}
return sum_price

},
handleCheck(){
// console.log('xxx')
if(this.checkgroup.length>0){
this.checkgroup=[]
}else {
this.checkgroup=this.datalist
}
},
handleOne(){
console.log('選中',this.checkgroup.length)
console.log('總資料',this.datalist.length)
if(this.checkgroup.length==this.datalist.length){
this.isAll=true
}else {
this.isAll=false
}
},
handleJ(item){
if(item.number<=1){
alert('不能再少了')
item.number=1
}else {
item.number--
}
}
}
})
</script>
</html>

1 v-model之lazy,number,trim

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>
<div id="box">
<input type="text" v-model.lazy="mytext">||{{mytext}}
<br>
<input type="number" v-model.number="mynumber">||{{mynumber}}
<br>
<input type="text" v-model.trim="mytrim">||{{mytrim}}||
</div>
</body>
<script>
var vm = new Vue({
el: '#box',
data: {
mytext:'',
mynumber:'',
mytrim:'',

},
})
</script>

</html>

2 fetch

1 vue專案跟後端互動,可以使用ajax

2.1 通過jq的ajax實現

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>

<div id="box">
<button @click="handleClick">點我載入美女資料</button>
美女你好:{{mytext}}
</div>
</body>
<script>
var myajax=$
var vm = new Vue({
el: '#box',
data: {
mytext:'',
},
methods:{
handleClick(){
myajax.ajax({
url:'http://127.0.0.1:5000/',
method:'get',
success: (data)=> {
console.log(data)
this.mytext=data
}
})
}
}

})
</script>
</html>
from flask import Flask,make_response
app=Flask(__name__)
@app.route('/')
def index():
print('請求來了')
res=make_response('hello world')
res.headers['Access-Control-Allow-Origin'] = '*'
return res
if __name__ == '__main__':
app.run()

2.2 fetche向後端傳送請求

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>
<div id="box">
<button @click="handleClick">點我載入美女資料</button>
從後端載入的資料:
<br>
使用者名稱:{{name}}
<br>
年齡:{{age}}
</div>
</body>
<script>
var vm = new Vue({
el: '#box',
data: {
name: '',
age:''
},
methods: {
handleClick() {
fetch('http://127.0.0.1:5000/').then(response => {
return response.json()
}).then(json => {
console.log('從後端獲取的json資料', json)
this.name=json.name
this.age=json.age

}).catch(ex => {
console.log('出異常', ex)
})
}
}
})
</script>

</html>
from flask import Flask,make_response,jsonify
app=Flask(__name__)

@app.route('/')
def index():
res=jsonify({'name':'lqz','age':18})
# 這兩行程式碼處理跨域
res=make_response(res)
res.headers['Access-Control-Allow-Origin'] = '*'
return res
if __name__ == '__main__':
app.run()

3 axios

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<title>Title</title>
</head>
<body>
<div id="box">
<button @click="handleClick">點我載入電影資料</button>
<ul>
<li v-for="item in datalist">
<p>電影名:{{item.name}}</p>
<p>導演:{{item.director}}</p>
<img :src="item.poster">
</li>
</ul>

</div>

</body>
<script>
var vm = new Vue({
el: '#box',
data: {
datalist:[],
},
methods: {
handleClick() {
axios.get("http://127.0.0.1:5000/film").then(res=>{
console.log(res.data)
if(res.data.status==0){
this.datalist=res.data.data.films
}
})

}
}

})
</script>

</html>
from flask import Flask, make_response, jsonify
import json
app = Flask(__name__)

@app.route('/film')
def film():
with open('film.json', 'rt', encoding='utf-8') as f:
dic = json.load(f)
res = jsonify(dic)

# 這兩行程式碼處理跨域
res = make_response(res)
res.headers['Access-Control-Allow-Origin'] = '*'
return res

if __name__ == '__main__':
app.run()

4 計算屬性

4.1 通過計算屬性來實現人名首字母大寫

1 直接再{{}}中寫js程式碼    html中儘量少寫jsdiamond
2 使用函式 {{函式()}} 使用多次會執行多次
3 使用計算屬性 當作變數來使用,多次使用只會執行一次

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>

<div id="box">
<p>{{name}}</p>
<p>{{name.substring(0,1).toUpperCase()+name.substring(1)}}</p>
<!-- <p>{{upperName()}}</p>-->
<!-- <p>{{upperName()}}</p>-->
<!-- <p>{{upperName()}}</p>-->

<p>{{getName}}</p>
<p>{{getName}}</p>
<p>{{getName}}</p>
<p>{{getName}}</p>
</div>

</body>
<script>
var vm = new Vue({
el: '#box',
data: {
name: 'asdfasdf'
},
methods: {
upperName() {
console.log('我執行了')
return this.name.substring(0, 1).toUpperCase() + this.name.substring(1)
}
},
computed: {
getName() {
console.log('我執行了')
return this.name.substring(0, 1).toUpperCase() + this.name.substring(1)
},
}

})
</script>

</html>

4.2 通過計算屬性重寫過濾小案例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>

<div id="box">
<input type="text" v-model="myinput" @input="handleChange"> {{myinput}}
<br>
<div>
<p v-for="data in new_arr">{{data}}</p>
</div>
</div>

</body>
<script>
var vm = new Vue({
el: '#box',
data: {
myinput:'',
arr: ['aabbc', 'abc', 'aabcd','ccdd','bbcc'],
},
computed:{
new_arr(){
return this.arr.filter(item=>{
return item.indexOf(this.myinput) >-1
})
}
}

})

</script>
</html>

5 虛擬dom與diff演算法 key的作用

1 vue有虛擬dom,跟真實dom做替換,使用的演算法是diff演算法
2 幾種方案
-分層級比較
-同key值比較(迴圈中儘量加key)
-元件或標籤的比較去替換

6 元件化開發基礎

1 元件是什麼
擴充套件 HTML 元素,封裝可重用的程式碼,目的是複用
-例如:有一個輪播,可以在很多頁面中使用,一個輪播有js,css,html
-元件把js,css,html放到一起,有邏輯,有樣式,有html
2 分類
-全域性元件
-區域性元件
3 工程化以後
一個元件就是一個 xx.vue

4 element ui 其實就是寫了一堆好看的元件,以後我們直接拿過來用就可以了

6.1 定義全域性元件並使用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/vue.js"></script>
<title>Title</title>
</head>
<body>

<div id="box">

<div @click="handleClick">我是根元件的div</div>
<child></child>
<ul>
<li v-for="i in 4">{{i}}</li>
</ul>
<div>
<child></child>
</div>



</div>


</body>
<script>
//建立元件物件(全域性元件)
Vue.component('child', {
template: `
<div>
<div style="background: red" @click="handleClick">我是頭部</div>
<div v-if="isShow">顯示消失</div>
</div>
`,
methods:{
handleClick(){
console.log('我被點選了')
this.isShow=!this.isShow
}
},
data(){
return {
isShow:true
}
},
})
var vm = new Vue({
el: '#box',
data: {
isShow:true,
},
methods:{
handleClick(){
console.log('根元件我被點選了')
}
}

})


</script>
</html>