03 . Vue基礎之計算屬性,元件基礎定義和使用

youmen發表於2020-11-14

vue元件

fetch請求元件

fetch

XMLHttpRequest是一個設計粗糙的API, 配置和呼叫方式非常混亂,而且基於事件的非同步模型寫起來不友好,相容性不好.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">

		<script type="text/javascript" src="lib/vue.js"></script>
	</head>
	<body>

		<div id="box">
			<button @click="handleClick()">獲取影片資訊</button>
			<ul>
				<li v-for="data in datalist">
					<h3>{{ data.name }}</h3>
					<img :src="data.poster">
				</li>
			</ul>
		</div>

		<script>
			new Vue({
				el: "#box",
				data: {
					datalist: []
				},
				methods: {
					handleClick() {
						fetch("./json/test.json").then(res => res.json()).then(res => {
							console.log(res.data.films)
							this.datalist = res.data.films
						})
					}
				}
			})
		</script>


		<!-- new Vue({
		el: "#box",
		data:{
			datalist:["111","222","333"]
		}
	}) -->
	</body>
</html>
axios請求元件
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">
		<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
		<script type="text/javascript" src="lib/vue.js"></script>
	</head>
	<body>

		<div id="box">
			<button @click="handleClick()">正在熱映</button>

			<ul>
				<li v-for="data in datalist">
					<h1>{{ data.name }}</h1>
					<img :src="data.poster">
				</li>
			</ul>
		</div>

		<script>
			new Vue({
				el: "#box",
				data: {
					datalist: []
				},
				methods: {
					handleClick() {
						axios.get("./json/test.json").then(res => {
							// axios 自歐東包裝data屬性 res.data
							console.log(res.data.data.films)
							this.datalist = res.data.data.films
						}).catch(err => {
							console.log(err);
						})
					}
				}
			})
		</script>
	</body>
</html>

vue計算屬性

/*
		複雜邏輯,模板難以維護
				1. 基礎例子
				2. 計算快取 VS methods
						- 計算屬性是基於他們的依賴進行快取的.
						- 計算屬性只有在他的相關依賴發生改變時才會重新求值
				3. 計算屬性VS watch
				    - v-model
*/

Example1

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">
		<script type="text/javascript" src="lib/vue.js"></script>
	</head>
	<body>

		<div id="box">
			<!-- 擷取myname字串將首字母大寫,不推薦,請看下面 -->
			{{ myname.substring(0,1).toUpperCase() + myname.substring(1) }}
			
			<!-- 不要加(),否則就是函式 -->
			<p>計算屬性:{{ getMyName }}</p>
			<p>普通方法:{{ getMyNameMethod() }}</p>
			
			<div>
				也需要計算結果
				<p>計算屬性:{{ getMyName }}</p>
				<!-- 計算屬性可以讓一個頁面多個地方呼叫一個計算結果只呼叫一次,而方法多次呼叫會多次執行  -->
				<!-- 1. 依賴的狀態改變了, 計算屬性會重新計算一遍  
					 2. 計算屬性會快取  -->
				<p>普通方法:{{ getMyNameMethod() }}</p>
			</div>
		</div>

		<script>
			vm = new Vue({
				el: "#box",
				data: {
					myname: "xiaoming"
				},
				
				methods:{
					getMyNameMethod(){
						console.log("getMyNameMethos-方法呼叫")
						return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1)					}
				},
				
				computed:{
					getMyName(){
						console.log("getMyName-計算屬性呼叫")
						return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1)
					}
				}
			})
		</script>
	</body>
</html>

Example2

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">
		<script type="text/javascript" src="lib/vue.js"></script>
	</head>
	<body>
		<div id="box">
			<input type="text" v-model="mytext" />
			<!-- <input type="text" @input="handleInput()" v-model="mytext" /> -->

			<ul>
				<li v-for="data in getMyDatalist">
					{{ data }}
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			var vm = new Vue({
				el: "#box",
				data: {
					mytext: "",
					datalist: ["aaa", "bbb", "ccc", "ddd", "eee", ],
				},

				computed: {
					getMyDatalist() {
						return this.datalist.filter(item => item.indexOf(this.mytext) > -1)
					}
				},
			})
		</script>

	</body>
</html>

vue元件

元件(Component)是 Vue.js 最強大的功能之一。

元件可以擴充套件 HTML 元素,封裝可重用的程式碼。

元件系統讓我們可以用獨立可複用的小元件來構建大型應用,幾乎任意型別的應用的介面都可以抽象為一個元件樹:

全域性元件
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">
		<script type="text/javascript" src="lib/vue.js"></script>

		<style>
			.navbar{
				background: red;
			}
		</style>
	</head>
	<body>
		<div id="box">
			<navbar></navbar>
			<navbar></navbar>
		</div>

		<script type="text/javascript">
			// 1. 全域性定義元件(作用域隔離)
			Vue.component("navbar", {
				template: `
				<div style="background:yellow">
					<button @click="handleback()">返回</button>
					navbar
					<button>主頁</button>
				</div>`,
				methods: {
					handleback() {
						console.log("back")
					}
				}
			})

			new Vue({
				el: "#box"

			})
		</script>

	</body>
</html>

相關文章