Vue渐进(一)入门

本文是一篇关于Vue.js的入门教程,由阿里P8尤雨溪创建。文章介绍了Vue作为渐进式js框架,强调简化DOM操作和响应式数据驱动。内容涵盖Vue的基本认识、入门示例、核心指令如v-text、v-html、v-on等,以及组件、Axios通信、计算属性、slot插槽和自定义事件等内容。

一、认识

官网:

https://cn.vuejs.org/

作者:

尤雨溪,据说现在是阿里P8

首先,官方说是渐进式js框架,对于后端程序员来说,我觉得渐进式的意思是指:可以通过操作很少的DOM甚至不需要操作DOM元素,就能轻易完成数据和视图的绑定。

它不推荐再使用jQuery

最后,抓住它三个关键词就行了:js框架、简化DOM操作、响应式数据驱动

二、入门

先把官网的例子看一看,入门肯定要写一遍hello world

<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="app">
		  {{ message }}
		</div>
	</body>
	<script>
		var app = new Vue({
		  el: '#app',
		  data: {
		    message: 'Hello Vue!'
		  }
		})
	</script>
</html>

效果:数据绑定上了

el的值就是css选择器,data里放数据

三、指令

v-text

作用:设置标签的文本值
简写:{{}}
效果:它会完全替换掉里边的文本,{{}}是这个指令的简写
所以:各有各的应用场景,要么完全替换,要么替换部分

		<div id="app">
			<h1 v-text="message">耗子尾汁</h1>
			<h1 v-text="info">耗子尾汁</h1>
			<h1>{{message}}耗子尾汁</h1>
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
		    message: '用户名:break',
			info: '用户名:java程序猿'
		  }
		})

效果

v-html

作用:设置标签的innerHTML

		<div id="app">
			<p v-html="context"></p>
			<p v-text="context"></p>
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
		    context: "<a href='#'>一个a标签</a>"
		  }
		})

效果

v-on

作用:给元素绑定事件
简写:@

		<div id="app">
			<input type="button" value="呆鸡" v-on:click="go" />
			<input type="button" value="划过" v-on:mouseenter="go" />
			<input type="button" value="双鸡" v-on:dblclick="go" />
			<input type="button" value="双鸡简写" @dblclick="go" />
			<p>{{count}}</p>
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
			  count: 1
		  },
		  methods:{
			  go: function(){
				  console.log("事件触发");
				  this.count++
			  }
		  }
		})

v-show

作用:根据真假显示/隐藏元素

		<div id="app">
			<input type="button" value="显示/隐藏" @click="go" />
			<img v-show="isShow" src="img/0005018622772314_b.jpg" />
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
			  isShow: true,
		  },
		  methods:{
			 go: function(){
				this.isShow = !this.isShow;
			  }
			}
		})

v-if

作用:根据真假显示/隐藏元素(操作dom元素)
与v-show不同的是:v-show是改变元素里边的属性,v-if是直接干掉这个标签

v-bind

作用:设置元素属性,比如class、title、src。。。
简写::属性名

		<div id="app">
			<img :src="imgSrc" alt="" :title="imageTit" />
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
			  imgSrc: 'img/0005018622772314_b.jpg',
			  imageTit: '这是一张图'
		  }
		})

v-for

作用:循环

<div id="app">
			<ul>
				<li v-for="(item,index) in arr">
					{{index}},城市:{{item}}
				</li>
			</ul>
			
			<ul>
				<li v-for="i in arr2">
					名字:{{i.name}}
				</li>
			</ul>
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
			  arr: ["北","上","广","深","杭"],
			  arr2: [
				  {name:"张"},
				  {name:"王"},
				  {name:"李"},
				  {name:"赵"}
			  ]
		  }
		})

键盘回车事件

		<div id="app">
			<input type="text" @keyup.enter="go('666')" />
		</div>
		var app = new Vue({
		  el: '#app',
		  methods:{
			  go: function(v1){
				  console.log("gogogo" + v1)
			  }
		  }
		})

v-model

作用:获取和设置表单元素的值(双向数据绑定)

		<div id="app">
			<input type="text" v-model="message" @keyup.enter="go" />
			<input type="button" @click="edit" value="更改" />
			{{message}}
		</div>
		var app = new Vue({
		  el: '#app',
		  data: {
			  message: ''
		  },
		  methods:{
			  go:function(){
				  console.log(this.message)
			  },
			  edit:function(){
				  this.message = 'hello Vue'
			  }
		  }
		})

效果

四、组件

组件官网上的图:第一层代表整个页面,第二层代表这个页面分三大块,第三层是具体每块里的干货

		<div id="app">
			<gogogo v-for="item in items" v-bind:go="item"></gogogo>
		</div>
		Vue.component("gogogo",{
			props: ["go"],
			template: "<ul><li>{{go}}</li></ul>"
		});
		
		
		var app = new Vue({
		  el: '#app',
		  
		  data: {
			  items: ["吃","吃x2","吃x3"]
		  },
		  methods:{
			  
		  }
		})

五、Axios通信

准备好json

{
	"name": "break",
	"url": "127.0.0.1",
	"page": 1,
	"isDel": false,
	"addr": {
		"country": "cn",
		"city": "longcheng"
	},
	"links": [{
			"name": "百度",
			"url": "www.baidu.com"
		},
		{
			"name": "腾讯",
			"url": "www.qq.com"
		}

	]
}
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div id="app"></div>
		var app = new Vue({
		  el: '#app',
		  mounted() {//钩子函数
		  	axios.get("json/test.json").then(response=>(console.log(response.data)))
		  }
		})

请求
拿值

		<div id="app">
			{{info.name}}
			{{info.addr.city}}
		</div>
		var app = new Vue({
		  el: '#app',
		  data(){
			  return{
				  info: {
					  name: null,
					  addr: {
						  city: null
					  }
				  }
			  }
		  },
		  mounted() {//钩子函数
		  	axios.get("json/test.json").then(response=>(this.info = response.data))
		  }
		})

效果
解决生命周期中出现模板的问题/闪烁问题(用空白替换)
问题

	<head>
		<meta charset="utf-8" />
		<title></title>
		
		
		<style>
			[v-clock]{
				display: none;
			}
		</style>
	</head>
	
	<body>
		<div id="app" v-clock>
			{{info.name}}
			{{info.addr.city}}
		</div>
	</body>

六、计算属性

计算属性可以想象成缓存,具体理解看下边代码
html

		<div id="app" v-clock>
			 
			{{go()}}
			<br />
			{{go2}}
		</div>

js

		var app = new Vue({
		  el: '#app',
		  data: {
			  message: "123456"
		  },
		  methods: {
			  go: function(){
				  return Date.now()
			  }
		  },
		  computed: {
			  go2: function(){
				  return Date.now()
			  }
		  }
		  
		})

调用,go是方法,而go2是属性,并且go2跟缓存类似,值不变
在这里插入图片描述
如果稍微改一下计算属性的方法,属性值就变了

		computed: {
			  go2: function(){
				  this.message
				  return Date.now()
			  }
		  }

效果

七、slot插槽

顾名思义,首先联想到的就是usb口,可动态插拔,在slot也差不多,玩的就是可复用
下来理解它

		<div id="app" v-clock>
			 <p>某列表</p>
			 <ul>
			 	<li>值1</li>
				<li>值2</li>
				<li>值3</li>
			 </ul>
		</div>

p里的text和li里的text都是从data里边来的,ul是不变的
html

		<div id="app">
			<go>
				<go-title slot="go-title" :title="title"></go-title>
				<go-items slot="go-items" v-for="item in items" :item="item"></go-items>
			</go>
		</div>

js

		//slot:插槽
		Vue.component("go",{
			template: '<div>\
							<slot name="go-title"></slot>\
							<ul>\
								<slot name="go-items"></slot>\
							</ul>\
						</div>'
		});
		
		Vue.component("go-title",{
			props: ['title'],
			template: '<div>{{title}}</div>'
		});
		Vue.component("go-items",{
			props: ['item'],
			template: '<li>{{item}}<li>'
		});
		
		var app = new Vue({
		  el: '#app',
		  data: {
			  title: "标题",
			  items: ["a","b","c"]
		  }
		});

效果

八、自定义事件内容分发

重点是this.$emit()

		<div id="app">
			<go>
				<go-title slot="go-title" :title="title"></go-title>
				<go-items slot="go-items" v-for="(item,index) in items"
				 :item="item" :index="index" @re="remove(index)"></go-items>
			</go>
		</div>
//slot:插槽
		Vue.component("go",{
			template: '<div>\
							<slot name="go-title"></slot>\
							<ul>\
								<slot name="go-items"></slot>\
							</ul>\
						</div>'
		});
		
		Vue.component("go-title",{
			props: ['title'],
			template: '<div>{{title}}</div>'
		});
		Vue.component("go-items",{
			props: ['item','index'],
			//只能绑定当前组件的方法
			template: '<li>{{index}}----{{item}}<button @click="remove">删除</button><li>',
			methods: {
				remove: function(index){
					this.$emit("re",index);//自定义事件分发
				}
			}
		});
		
		var app = new Vue({
		  el: '#app',
		  data: {
			  title: "标题",
			  items: ["a","b","c"]
		  },
		  methods: {
			  remove: function(index){
				  console.log(this.items[index]);
				  this.items.splice(index,1);
			  }
		  }
		});
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值