类似抖音的短视频管理系统+Java后端+vue前端(15)

vue组件:把网页中的html+css+javascript封装起来,形成一个标签

普通网页的组件及通讯

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- <script src="https://unpkg.com/vue@next"></script> -->
		<script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="app">
			{{msg}}<br/>
			<mydemo></mydemo>
			<br/>
			<hello :title = "title" @xiaoming="receiveMsgFromChild"></hello>
		</div>
		<div id="app2">
			<mydemo></mydemo><br/>
		
		</div>
		<script>
			//全局组件
			Vue.component('mydemo', {
			  data: function () {
			    return {
			      msg1:"AAAAAAA"
			    }
			  },
			  template: '<div>{{msg1}}</div>'
			})
			var helloobj={
				data:function(){
					return{
						msg2:"我是app 局部组件",
						score:1,
					}
				},
				props:["title"],
				template:`<div>
					
					  <h1>{{msg2}}</h1> <br/>
					  <h2>...........{{title}}</h2>
					  {{score}}
					  <button @click="score=score+1">计数</button>
					 <button @click="addScore()">计数2</button><br/>
					 <button @click="ziChuanFu()">子组件给父组件发送消息</button>
					</div>`,
				methods:{
					addScore:function(){
						this.score = this.score+1;
					},
					ziChuanFu:function(){
						this.$emit("xiaoming",{"xuehao":"额hi黑恶hi",age:1232})
					}
				}
	}
			
			var app = new Vue({
				el:"#app",
				data:{
					msg:"123123",
					title:"我是一个标题 来自父组件"
				},
				components:{
					"hello":helloobj
				},
				methods:{
					receiveMsgFromChild:function(data){
						console.log(data)
					}
				}
			})
			var  app1 = new Vue({
				el:"#app2"
				
				
			})
		</script>
	</body>
</html>

插槽

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/v2.6.10/vue.js"></script>
		
	</head>
	<body>
		<div id="app">
			<hello>
				<!-- 俱名插槽 -->
			<template v-slot:ch2>
			    <h1>Here might be a page title</h1>
			  </template>
			  <button>difuhsdiuhfd</button>
			</hello>
			  <img src="img/a.gif">
			
		</div>
		
		<script>
			// 在组件之间填充内容,可以使用插槽slot
			var obj = {
				data:function(){
					return{
						msg1:"我是hello子组件"
					}
				},
				template:`
				 <div>{{msg1}}</br>
				  <slot name='ch2'></slot>
				  <slot></slot>
				 </div>
				`
			}
			
			var app = new Vue({
				el:"#app",
				components:{
					"hello":obj
				}
			})
		</script>
	</body>
</html>

动态组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/v2.6.10/vue.js"></script>
		<style>
			ul{
				width: 100%;
				display: flex;
				list-style: none;
				position: absolute;
				bottom: 0;
				font-size: 40px;
				font-weight: bold;
			}
			ul li {
				flex: 1;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- keep-alive缓存组件的值 -->
			<keep-alive>
				<component :is = "is"></component>
			</keep-alive>
			<ul>
				<li @click = "changeComponent('home')">home</li>
				<li @click = "changeComponent('order')">order</li>	
				<li @click = "changeComponent('my')">my</li>

			</ul>
		</div>
		
		<script>
			var home = {
				data:function(){
					return{
						score:1
					}
				},
				template:`<div>AAAA...{{score}}
				<button @click="score++">++</button></div>
					`,
			}
			var order = {
				template:`<div>BBBB</div>`,
			}
			var my = {
				template:`<div>CCCC</div>`,
			}
			
			var app = new Vue({
				el:"#app",
				data:{
					is:"home"
				},
				components:{
					"home":home,
					"order":order,
					"my":my
				},
				methods:{
					changeComponent(zhi){
						this.is = zhi
					}
				}
			})
		</script>
	</body>
</html>

非父子组件传输


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/v2.6.10/vue.js"></script>
		
	</head>
	<body>
		<div id="app">
			<helloa></helloa>
			<hellob></hellob>
		</div>
		<script>
			//事件总线传输非父子组件的消息(空的vue对象)
			var bus = new Vue();
			
			var obj1={
				data:function(){
					return {
						msg1:""
					}
				},
				template:`
					<div>AAAAAAAAA
					<br />
					<span>接受b组件的消息:{{msg1}}</span>
					<br/>
					<button @click="sendMssege">向hellob传输消息</button>
					</div>
					
				`,
				methods:{
					sendMssege:function(){
						bus.$emit("aa","来自组件A组件的问候")
					}
				},
				//组件都加载完之后执行的函数
				mounted(){
					var that = this
					bus.$on("bb",function(data){
						console.log(data)
						that.msg1 = data
					})
				}
			}
			var obj2={
				data:function(){
					return {
						msg2:""
					}
				},
				template:`
					<div>BBBBBBBBBB
					<br />
					<span>接受a组件的消息:{{msg2}}</span>
					<br/>
					<button @click="sendMssege">向helloa传输消息</button>
					</div>
				`,
				methods:{
					sendMssege:function(){
						bus.$emit("bb","来自组件B组件的问候")
					}
				},
				//组件都加载完之后执行的函数
				mounted(){
					var  that = this
					bus.$on("aa",function(data){
						console.log(data)
						that.msg2 = data
					})
				}
			}
			
			var app = new Vue({
				el:"#app",
				data:{
					msg:"123123132123"
				},
				components:{
					"helloa":obj1,
					"hellob":obj2,
				}
			})
		</script>
	</body>
</html>

过滤器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/v2.6.10/vue.js"></script>
	</head>
	<body>
		<div id="app">
			{{msg|capitalMsg}}
		</div>
		<script>
			var app = new Vue({
				el:"#app",
				data:{
					msg:"abCDEFG"
				},
				filters:{
					capitalMsg:function(value){
						if(!value){
							return ''
						}
						var zhi = value.charAt(0).toUpperCase()+value.slice(1)
						return zhi.split("").reverse().join("")
					}
				}
			})
		</script>
	</body>
</html>

自定义指令

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/v2.6.10/vue.js"></script>
		<style>
			@keyframes zhuan{
				from{
					transform: rotate(0deg);
				}
				to{
					transform: rotate(360deg);
				}
			}
		</style>
	</head>
	<body>
		<div id="app">
			{{msg}}<br/>
			<input v-focus/><br />
			<input v-focus1/><br />
			<div id="hook-arguments-example" v-demo:foo.a.b="message">
				
				
			</div>
			<!--  带有参数的自定义指令 -->
			<div id="baseexample">
			  <p>Scroll down the page</p>
			  <!--  让当前的p元素标签距离上边是200像素 -->
			  <p v-pin="1000">Stick me 200px from the top of the page</p>
			</div>
			
			<div id="dynamicexample">
			  <h3>...............Scroll down inside this section ↓</h3>
			  <p v-pin1:[direction]="80">I am pinned onto the page at 200px to the left.</p>
			</div>
			
		</div>
	</body>
	<script>
		//注册一个全局自定义指令 v-focus
		Vue.directive('focus',{
			// 当被绑定的元素插入到 DOM 中时……
			inserted:function(el){
				// 聚焦元素
				// el 相当于input对象
				el.focus()
				el.style.border = "10px solid pink"
			}
		})
		// 输出钩子函数一些参数
		// binding绑定了一参数   vnode虚拟节点
		Vue.directive('demo', {
		  bind: function (el, binding, vnode) {
		    var s = JSON.stringify
		    el.innerHTML =
		      'name: '       + s(binding.name) + '<br>' +
		      'value: '      + s(binding.value) + '<br>' +
		      'expression: ' + s(binding.expression) + '<br>' +
		      'argument: '   + s(binding.arg) + '<br>' +
		      'modifiers: '  + s(binding.modifiers) + '<br>' +
		      'vnode keys: ' + Object.keys(vnode).join(', ')
		  }
		})
		Vue.directive('pin', {
		  bind: function (el, binding, vnode) {
		    el.style.position = 'fixed'
		    el.style.top = binding.value + 'px'
			 el.style.left = binding.value + 'px'
		  }
		})
		
		
		Vue.directive('pin1', {
		  bind: function (el, binding, vnode) {
		    el.style.position = 'fixed'
		    var s = (binding.arg == 'left' ? 'left' : 'animation')
			// 	//  style[s] = style.animation
		    //el.style[s] = binding.value + 'px'
			// 有旋转的效果
			el.style[s] = "zhuan 3s linear infinite"
		  }
		})
		var app = new Vue({
			el:"#app",
			data:{
				msg:"qewoi2313iojioj",
				direction:"top"
			},
			directives: {
			  focus1: {
			    // 指令的定义
			    inserted: function (el) {
					// v-focus1 这个指令 让输入框变长
			      el.style.width = "900px";
			    }
			  }
			}
		
		})
	</script>
</html>