IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> VUE学习(十一)、组件——非单文件组件、单文件组件 -> 正文阅读

[JavaScript知识库]VUE学习(十一)、组件——非单文件组件、单文件组件

VUE学习(十一)、组件——非单文件组件、单文件组件

一、非单文件组件

一个文件包含有n个组件

1、基本使用

<body>
	<!-- 
		Vue中使用组件的三大步骤:
			一、定义组件(创建组件)
			二、注册组件
			三、使用组件(写组件标签)

		一、如何定义一个组件?
				使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;
				区别如下:
					1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
					2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。
				备注:使用template可以配置组件结构。

		二、如何注册组件?
			1.局部注册:靠new Vue的时候传入components选项
			2.全局注册:靠Vue.component('组件名',组件)

		三、编写组件标签:
			<school></school>
	-->
	<!-- 准备好一个容器-->
	<div id="root">
		<hello></hello>
		<hr />
		<h1>{{msg}}</h1>
		<hr />
		<!-- 第三步:编写组件标签 -->
		<school></school>
		<hr />
		<!-- 第三步:编写组件标签 -->
		<student></student>
	</div>

	<div id="root2">
		<hello></hello>
	</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false;

	//第一步:创建school组件
	const school = Vue.extend({
		template: `
			<div class="demo">
				<h2>学校名称:{{schoolName}}</h2>
				<h2>学校地址:{{address}}</h2>
				<button @click="showName">点我提示学校名</button>	
			</div>
		`,
		// el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
		data() {
			return {
				schoolName: "xxx大学",
				address: "山东"
			};
		},
		methods: {
			showName() {
				alert(this.schoolName);
			}
		}
	});

	//第一步:创建student组件
	const student = Vue.extend({
		template: `
			<div>
				<h2>学生姓名:{{studentName}}</h2>
				<h2>学生年龄:{{age}}</h2>
			</div>
		`,
		data() {
			return {
				studentName: "张三",
				age: 18
			};
		}
	});

	//第一步:创建hello组件
	const hello = Vue.extend({
		template: `
			<div>	
				<h2>你好啊!{{name}}</h2>
			</div>
		`,
		data() {
			return {
				name: "Tom"
			};
		}
	});

	//第二步:全局注册组件
	Vue.component("hello", hello);

	//创建vm
	new Vue({
		el: "#root",
		data: {
			msg: "你好啊!"
		},
		//第二步:注册组件(局部注册)
		components: {
			'school': school,
			student //简写
		}
	});

	new Vue({
		el: "#root2"
	});
</script>

2、注意点

<body>
	<!-- 
		几个注意点:
			1.关于组件名:
				一个单词组成:
					第一种写法(首字母小写):school
					第二种写法(首字母大写):School
				多个单词组成:
					第一种写法(kebab-case命名):my-school
					第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
				备注:
					(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
					(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

			2.关于组件标签:
				第一种写法:<school></school>
				第二种写法:<school/>
				备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。(多次使用只能渲染第一次的)

			3.一个简写方式:
				const school = Vue.extend(options) 可简写为:const school = options
	-->
	<!-- 准备好一个容器-->
	<div id="root">
		<h1>{{msg}}</h1>
		<school></school>
	</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false;

	//定义组件
	const s = Vue.extend({
		name: "myname", //使用name配置项指定组件在开发者工具中呈现的名字
		template: `
			<div>
				<h2>学校名称:{{name}}</h2>	
				<h2>学校地址:{{address}}</h2>	
			</div>
		`,
		data() {
			return {
				name: "xx大学",
				address: "云南"
			};
		}
	});

	new Vue({
		el: "#root",
		data: {
			msg: "欢迎学习Vue!"
		},
		components: {
			school: s
		}
	});
</script>

3、组件的嵌套

<body>
	<!-- 准备好一个容器-->
	<div id="root">
		
	</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	//定义student组件
	const student = Vue.extend({
		name:'student',
		template:`
			<div>
				<h2>学生姓名:{{name}}</h2>	
				<h2>学生年龄:{{age}}</h2>	
			</div>
		`,
		data(){
			return {
				name:'xxx大学',
				age:18
			}
		}
	})
	
	//定义school组件
	const school = Vue.extend({
		name:'school',
		template:`
			<div>
				<h2>学校名称:{{name}}</h2>	
				<h2>学校地址:{{address}}</h2>	
				<student></student>
			</div>
		`,
		data(){
			return {
				name:'xxx大学',
				address:'北京'
			}
		},
		//注册组件(局部)
		components:{
			student
		}
	})

	//定义hello组件
	const hello = Vue.extend({
		template:`<h1>{{msg}}</h1>`,
		data(){
			return {
				msg:'欢迎来到xxx大学学习!'
			}
		}
	})
	
	//定义app组件
	const app = Vue.extend({
		template:`
			<div>	
				<hello></hello>
				<school></school>
			</div>
		`,
		components:{
			school,
			hello
		}
	})

	//创建vm
	new Vue({
		template:'<app></app>',
		el:'#root',
		//注册组件(局部)
		components:{app}
	})
</script>

4、VueComponent

<body>
	<!-- 
		关于VueComponent:
			1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

			2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
				即Vue帮我们执行的:new VueComponent(options)。

			3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

			4.关于this指向:
				(1).组件配置中:
					data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
				(2).new Vue(options)配置中:
					data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

			5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
				Vue的实例对象,以后简称vm。
	-->
	<!-- 准备好一个容器-->
	<div id="root">
		<school></school>
		<hello></hello>
	</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false
	
	//定义school组件
	const school = Vue.extend({
		name:'school',
		template:`
			<div>
				<h2>学校名称:{{name}}</h2>	
				<h2>学校地址:{{address}}</h2>	
				<button @click="showName">点我提示学校名</button>
			</div>
		`,
		data(){
			return {
				name:'xxx大学',
				address:'北京'
			}
		},
		methods: {
			showName(){
				console.log('showName',this)
			}
		},
	})

	const test = Vue.extend({
		template:`<span>atguigu</span>`
	})

	//定义hello组件
	const hello = Vue.extend({
		template:`
			<div>
				<h2>{{msg}}</h2>
				<test></test>	
			</div>
		`,
		data(){
			return {
				msg:'你好啊!'
			}
		},
		components:{test}
	})


	// console.log('@',school)
	// console.log('#',hello)

	//创建vm
	const vm = new Vue({
		el:'#root',
		components:{school,hello}
	})
</script>

5、 一个重要的内置关系

<body>
	<!-- 
			1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
			2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
	-->
	<!-- 准备好一个容器-->
	<div id="root">
		<school></school>
	</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
	Vue.prototype.x = 99

	//定义school组件
	const school = Vue.extend({
		name:'school',
		template:`
			<div>
				<h2>学校名称:{{name}}</h2>	
				<h2>学校地址:{{address}}</h2>	
				<button @click="showX">点我输出x</button>
			</div>
		`,
		data(){
			return {
				name:'xxx大学',
				address:'北京'
			}
		},
		methods: {
			showX(){
				console.log(this.x)
			}
		},
	})

	//创建一个vm
	const vm = new Vue({
		el:'#root',
		data:{
			msg:'你好'
		},
		components:{school}
	})

	
	//定义一个构造函数
	/* function Demo(){
		this.a = 1
		this.b = 2
	}
	//创建一个Demo的实例对象
	const d = new Demo()

	console.log(Demo.prototype) //显示原型属性

	console.log(d.__proto__) //隐式原型属性

	console.log(Demo.prototype === d.__proto__)

	//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
	Demo.prototype.x = 99

	console.log('@',d) */

</script>

二、单文件组件

一个文件中只包含1个组件

1、School.vue

<template>
    <!-- template组件的结构 -->
    <div class="demo">
        <h2>学校名称:{{ name }}</h2>
        <h2>学校地址:{{ address }}</h2>
        <button @click="showName">点我提示学校名</button>
    </div>
</template>

<script>
//组件交互相关的代码
// 暴露相关知识 ES6模块化
// 第一种暴露方式(分别暴露)引入:import {xxx} from xxx
export const school = Vue.extend({
    data() {
        return {
            name: "xxx大学",
            address: "北京昌平"
        };
    },
    methods: {
        showName() {
            alert(this.name);
        }
    }
});

/*
// 第二种暴露方式(统一暴露)引入:import {xxx} from xxx
export { school };
// 第三种暴露方式(默认暴露)(一般用这个)引入:import xxx from xxx
export default school
// 默认暴露简写
export default Vue.extend({
    name: "School",
    data() {
        return {
            name: "xxx大学",
            address: "北京昌平"
        };
    },
    methods: {
        showName() {
            alert(this.name);
        }
    }
})
// 或者
export default{
	name: "School",
    data() {
        return {
            name: "xxx大学",
            address: "北京昌平"
        };
    },
    methods: {
        showName() {
            alert(this.name);
        }
    }
}

*/
</script>

<style>
/* 组件的样式 */
.demo {
    background-color: orange;
}
</style>

2、Student.vue

<template>
	<div>
		<h2>学生姓名:{{name}}</h2>
		<h2>学生年龄:{{age}}</h2>
	</div>
</template>

<script>
	 export default {
		name:'Student',
		data(){
			return {
				name:'张三',
				age:18
			}
		}
	}
</script>

3、main.js

// 浏览器不支持模块化语法,需要脚手架才能运行
import App from "./App.vue";

new Vue({
    el: "#root",
    template: `<App></App>`,
    components: { App }
});

4、index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>练习一下单文件组件的语法</title>
    </head>
    <body>
        <!-- 准备一个容器 -->
        <div id="root">

		</div>
        <!-- <script type="text/javascript" src="../js/vue.js"></script> -->
        <!-- <script type="text/javascript" src="./main.js"></script> -->
    </body>
	<script src="../js/vue.js"></script>
	<script src="./main.js"></script>
</html>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 22:59:45  更:2022-01-29 23:01:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:34:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码