VUE—從入門到飛起(一)

目錄

基礎

起步

插值表達式{{}}、v-cloak、v-text、v-html、v-bind、v-on

學了這麼多了,寫一個跑馬燈效果鞏固一下吧

事件修飾符(打開瀏覽器f12調試哦)

v-model實操

樣式

外聯樣式

內聯樣式

v-if、v-show

v-for


基礎

 

起步

一定一定要引入vue.js:

<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app">
	<p>{{ message }}</p>
</div>

<script>
	//當我們導包的時候,瀏覽器的內存中,就多了一個Vue構造函數
	var vm = new Vue({ //每次都需要new Vue
		el: '#app',
		data: { //data屬性中存放的是el中要用到的數據
			message: 'Hello Vue.js!' //不需要手動操作dom元素
		}
	})
</script>

插值表達式{{}}、v-cloak、v-text、v-html、v-bind、v-on

<style>
	[v-cloak] {
		display: none;
	}
</style>
<div id="app">
	<!-- 使用v-cloak 能夠解決插值表達式閃爍問題-->
	<p v-cloak>-----{{ message }}--+++</p>
	<h4 v-text="message">=-=-=-=</h4>
	<!--
  	區別:1.v-text會覆蓋元素中原本的內容,插值表達式只會替換自己的佔位符,不會把整個元素內容清空。
  			2.v-text不會有閃爍問題,插值表達式會有閃爍問題
  			3.v-html會解析html標籤
  -->
	<div>{{ message2 }}</div>
	<div v-text="message2"></div>
	<div v-html="message2"></div>

	<!--v-bind: 是vue定義提供的用於綁定屬性的指令 -->
	<!--v-bind:可以簡寫爲:  -->
	<!--v-bind:中可以寫合法的js表達式  -->
	<input type="button" value="按鈕" v-bind:title="mytitle + '123'" />

	<!-- vue中提供了v-on:事件綁定機制 ,注意,v-on裏面也是變量,不能直接alert等等-->
	<!-- vue中提供了v-on:事件綁定機制 ,v-on可以縮寫爲@,方法不需要傳參可以不寫括號-->
	<input type="button" value="按鈕2" :title="mytitle + '123'" v-on:click="show" />
	<input type="button" value="按鈕3" :title="mytitle + '123'" @mouseleave="show()" />
</div>

<script>
	var vm = new Vue({
		el: '#app',
		data: {
			message: 'Hello Vue.js!',
			message2: '<h1>我是H1</h1>',
			mytitle: '這是自定義title'
		},
		methods: { //這個metho屬性中定義了當前vue實例中所有的方法
			show: function() {
				alert('hello');
			}

		}
	})
</script>

學了這麼多了,寫一個跑馬燈效果鞏固一下吧

<body>
	<div id="app">
		<!--<input type="button" value="浪起來" @click="lang"/>-->
		<input type="button" value="浪起來2" @click="lang2" />
		<input type="button" value="停止" @click="stop" />
		<h4>{{ msg }}</h4>
	</div>
</body>

<script>
	//this.數據屬性名  或this.方法名,來獲取當前實例的屬性和方法
	//vue會監聽data的改變,如果data改變,會立即應用到view中去(好處:只關心數據,不需要關心如何渲染到頁面)
	var vm = new Vue({
		el: "#app",
		data: {
			msg: "猥瑣發育,別浪~~",
			intervalId: null //定時器的id
		},
		methods: {
			lang: function() {
				var _this = this;
				//this指向問題
				if(this.intervalId != null) return;
				this.intervalId = setInterval(function() {
					var start = _this.msg.substring(0, 1);
					var end = _this.msg.substring(1);
					_this.msg = end + start;
				}, 200)
			},
			lang2() { //es6語法
				//箭頭函數,解決this指向問題
				//定時器只能開一次,做判斷
				if(this.intervalId != null) return;
				this.intervalId = setInterval(() => {
					var start = this.msg.substring(0, 1);
					var end = this.msg.substring(1);
					this.msg = end + start;
				}, 200)
			},
			stop() { //停止定時器
				clearInterval(this.intervalId);
				this.intervalId = null;
			}
		}
	})
</script>

事件修飾符(打開瀏覽器f12調試哦)

<style>
	.inner {
		height: 50px;
		background-color: chartreuse;
	}
	
	.out {
		padding: 10px;
		background-color: red;
	}
</style>
<body>
	<div id="app">
		<!-- 這裏點擊按鈕,會先觸發按鈕的事件,再觸發div的點擊事件,原因:冒泡 -->
		<div class="inner" @click="divclk">
			<input type="button" @click="btnclk" value="戳我" />
			<!-- .stop來阻止冒泡,只觸發按鈕的點擊事件 -->
			<input type="button" @click.stop="btnclk" value="戳我" />
			<br/>

			<!-- prevent阻止默認行爲,這裏阻止了a標籤跳轉到百度(也可以用於阻止submit) -->
			<a href="http://www.baidu.com" @click.prevent="aclk">先去百度</a>
		</div>

		<div class="inner" @click.capture="divclk">
			<!-- capture捕獲機制,先觸發外層div的點擊,再觸發按鈕的點擊事件 -->
			<!-- 這裏需要在上層的div點擊事件加capture<div class="inner" @click="divclk">-->
			<input type="button" @click="btnclk" value="戳我capture" />
		</div>

		<!-- self只有點擊當前元素時纔會觸發-->
		<div class="inner" @click.self="divclk">
			<input type="button" @click="btnclk" value="戳我self" />
		</div>

		<!-- prevent阻止默認行爲,這裏阻止了a標籤跳轉到百度(也可以用於阻止submit) -->
		<!-- once只會觸發一次,默認行爲也會只執行一次 -->
		<!--可以串聯使用 -->
		<a href="http://www.baidu.com" @click.prevent.once="aclk">先去百度</a>

		<!--演示.stop和.self區別-->
		<!--
			.self只會阻止自己身上冒泡行爲的觸發,並不會真正阻止冒泡行爲。
        -->
		<div class="out" @click="otdivclk">
			<div class="inner" @click="divclk">
				<input type="button" @click.stop="btnclk" value="戳我" />
			</div>
		</div>
		<div class="out" @click="otdivclk">
			<div class="inner" @click.self="divclk">
				<input type="button" @click="btnclk" value="戳我" />
			</div>
		</div>

	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {

		},
		methods: {
			btnclk() {
				console.log("這是按鈕的點擊");
			},
			divclk() {
				console.log("這是div點擊");
			},
			aclk() {
				console.log("a點擊了");
			},
			otdivclk() {
				console.log("外層div點擊");
			}
		}
	})
</script>

v-model實操

<body>
	<div id="app">
		<h4>{{ msg }}</h4>
		<!--v-bind只能實現數據的單向綁定-->
		<input type="text" :value="msg" />
		<!--v-model能實現數據的雙向綁定,只能用於表單元素input,select,checkbox,textarea-->
		<input type="text" v-model="msg" />

	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {
			msg: "大家都是好學生"
		},
		methods: {

		}
	})
</script>

<body>
	<div id="app">
		<input type="text" v-model="n1" />
		<select v-model="opt">
			<option value="+">+</option>
			<option value="-">-</option>
			<option value="*">*</option>
			<option value="/">/</option>
		</select>
		<input type="text" v-model="n2" />
		<input type="button" value="=" @click="calc" />
		<input type="text" v-model="result" />

	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {
			n1: 0,
			n2: 0,
			result: 0,
			opt: '+'
		},
		methods: {
			calc() {
				/*switch (this.opt){
					case '+':
						this.result = parseInt(this.n1) +parseInt(this.n2);
						break;
					case '-':
						this.result = parseInt(this.n1) -parseInt(this.n2);
						break;
					case '*':
						this.result = parseInt(this.n1) *parseInt(this.n2);
						break;
					case '/':
						this.result = parseInt(this.n1) /parseInt(this.n2);
						break;
					default:
						break;
				}*/
				//eval解析字符串  投機取巧的方式,正式開發儘量少用
				var codeStr = 'parseInt(this.n1)' + this.opt + 'parseInt(this.n2)'
				this.result = eval(codeStr);
			}
		}
	})
</script>

樣式

外聯樣式

<style>
	.red {
		color: red;
	}
	
	.thin {
		font-weight: 200;
	}
	
	.italic {
		font-style: italic;
	}
	
	.active {
		letter-spacing: 0.5em;
	}
</style>
<body>
	<div id="app">
		<h1 class="red thin">這是一個h1</h1>
		<!--第一種方式,直接傳遞一個數組,注意這裏需要用v-bind做綁定。如果沒有該變量,用引號可以直接獲取class-->
		<h1 :class="['red', 'italic']">數組</h1>
		<!--第二種方式:三元表達式-->
		<h1 :class="['red', 'italic', flag ? 'active':'']">三元表達式</h1>
		<!--第三種方式:數組中使用對象-->
		<h1 :class="['red', 'italic', {'active':flag}]">對象</h1>
		<!--第四種方式:直接使用對象,爲class使用v-bind使用對象時候,對象屬性是類名(屬性可帶引號可不帶);
		屬性值爲標識符
	-->
		<h1 :class="{'red':flag, italic:flag,active:false}">直接使用對象</h1>
		<h1 :class="classObj">直接使用對象</h1>
	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {
			flag: true,
			classObj: {
				'red': false,
				italic: true,
				active: false
			}
		},
		methods: {

		}
	})
</script>

內聯樣式

<body>
	<div id="app">
		<!--對象就是無序鍵值對的集合-->
		<h1 :style="{color:'red', 'font-weight':200}">這是對象</h1>
		<h1 :style="styleObj1">這是對象</h1>

		<!--對象數組-->
		<h1 :style="[styleObj1, styleObj2]">這是對象數組</h1>
	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {
			flag: true,
			styleObj1: {
				color: 'red',
				'font-weight': 200
			},
			styleObj2: {
				'font-style': 'italic'
			}
		},
		methods: {

		}
	})
</script>

v-if、v-show

<body>
	<div id="app">

		<input type="button" value="點擊" @click="toggle" />
		<input type="button" value="或者直接這樣點擊" @click="flag = !flag" />
		<!--
			v-if是每次都會重新刪除或創建元素;
			v-show是每次不會重新刪除創建元素,只是切換display:none樣式
			v-if有較高的切換性能消耗,v-show有較高的初始渲染消耗
			-->
		<h3 v-if="flag">v-if</h3>
		<h3 v-show="flag">v-show</h3>
	</div>
</body>

<script>
	var vm = new Vue({
		el: '#app',
		data: {
			flag: true
		},
		methods: {
			toggle() {
				this.flag = !this.flag;
			}
		}
	})
</script>

v-for

<body>
	<div id="app">
		<!--循環數字數組-->
		<span v-for="item in list">{{ item }}</span>
		<br />
		<span v-for="(item, i) in list">值:{{ item }}索引: {{ i }}</span>
		<hr />
		<!--循環對象數組,i爲索引-->
		<p v-for="user in listObj">id:{{ user.id }}名字:{{ user.name }}</p>
		<!--<p v-for="(user, i) in listObj">id:{{ user.id }}名字:{{ user.name }}</p>-->
		<hr />
		<!--循環對象-->
		<!--注意,在遍歷對象身上的鍵值對時,除了有val,key,還有索引i-->
		<p v-for="(val, key, i) in user">{{ val }}: {{ key }}: {{ i }}</p>
		<hr />
		<!--迭代數字,從1開始,同樣也有索引-->
		<p v-for="(count, i) in 5">{{ count }} {{ i }}</p>
		
	</div>
</body>
<script>
	var vm = new Vue({
		el:"#app",
		data:{
			list:[1, 2, 3, 4, 5, 6],
			listObj:[
				{ id :1, name:'z1'},
				{ id :2, name:'z2'},
				{ id :3, name:'z3'},
				{ id :4, name:'z4'}
			],
			user:{
				id:1,
				name:'z3',
				gender:'男'
			}
		},
		methods:{
			
		}
	})
</script>
<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="添加" @click="add" />
		</div>
		<!--
			注意:v-for循環的時候,key屬性只能用number或string
			注意:key在使用的時候,必須使用v-bind綁定
			在組件中使用v-for,或者在一些特殊情況中,必須使用key
		-->
		<p v-for="item in list" :key="item.id">
			<input type="checkbox" value="item.id" /> ------{{ item.id }}----{{ item.name }}
		</p>
	</div>
</body>
<script>
	var vm = new Vue({
		el: "#app",
		data: {
			id: '',
			name: '',
			list: [{
					id: 1,
					name: 'z1'
				},
				{
					id: 2,
					name: 'z2'
				},
				{
					id: 3,
					name: 'z3'
				},
				{
					id: 4,
					name: 'z4'
				}
			]
		},
		methods: {
			add() {
				this.list.unshift({
					id: this.id,
					name: this.name
				}); //前插入
			}
		}
	})
</script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章