前端基础之组件

组件:实现应用中局部功能代码和资源的集合

非单文件组件

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<script type="text/javascript" src="../js/vue.js"></script> <!-- 引入Vue.js -->

</head>

<body>

<div id="root">

<h1>{{msg}}</h1>

<!-- 3.编写组件标签 -->

<school></school>

<hr>

<student></student>

</div>

<script type="text/javascript">

//1.创建school组件

const school= Vue.extend({

template:`

<div>

<h2>学校名称:{{schoolName}}</h2>

<h2>学校地址:{{addr}}</h2>

<button @click="showName">点我提示学校名称</button>

</div>

`,

//不需要创建el配置项

data(){

return{

schoolName:'尚硅谷',

addr:'北京',

}

},

methods: {

showName(){

alert(this.schoolName)

}

}

})

//1.创建student组件

const student= Vue.extend({

template:`

<div>

<h2>学生名称:{{studentName}}</h2>

<h2>学生年龄:{{age}}</h2>

</div>

`,

//不需要创建el配置项

data(){

return{

studentName:'张三',

age:18

}

}

})

//1.创建hello组件

const hello=Vue.extend({

template:`

<div>

<h1>你好</h1>

</div>

`,

data(){

return{

name:'tim'

}

}

})

//2.注册全局组件

Vue.component('hello',hello)

//创建vm

const vm= new Vue({

el:'#root',

data:{

msg:'你好'

},

//2.组件注册(局部注册)

components: {

school,

student

}

})

</script>

</body>

</html>

组件的结构我们在template中使用。并且使用 ` ` 将其包裹

可以使用name配置项指定组件在开发者工具中呈现的名字

组件标准化写法

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<script type="text/javascript" src="../js/vue.js"></script> <!-- 引入Vue.js -->

</head>

<body>

<div id="root">

<app></app>

</div>

<script type="text/javascript">

//定义student组件

const student=Vue.extend({

template:`

<div>

<h2>学生年龄:{{age}}</h2>

<h2>学生名称:{{name}}</h2>

</div>

`,data(){

return{

name:'尚硅谷',

age:18

}

}

})

//定义school组件

const school=Vue.extend({

template:`

<div>

<h2>学校地址:{{addr}}</h2>

<h2>学校名称:{{name}}</h2>

<student></student>

</div>

`,data(){

return{

name:'尚硅谷',

addr:'北京'

}

},

//注册子组件,局部

components: {

student

}

})

//注册hello组件

const hello= Vue.extend({

template:`

<div>

<h1>{{msg}}</h1>

</div>

`,

data(){

return{

msg:'hello'

}

}

})

//创建app组件

const app= Vue.extend({

template:`

<div>

<school></school>

<hello></hello>

</div>

`,

components:{

school,

hello

}

})

//注册组件

new Vue({

el:'#root',

components: {app}

})

</script>

</body>

</html>

我们在组件的创建的时候,需要将父组件定义在子组件的后面,并且,需要一个统一的app组件来作为所有组件的父组件,然后只将其注册到vm中即可

VueComponent 构造函数

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<script type="text/javascript" src="../js/vue.js"></script> <!-- 引入Vue.js -->

</head>

<body>

<div id="root">

<school></school>

</div>

<script type="text/javascript">

//定义school组件

const school=Vue.extend({

template:`

<div>

<h2>学校地址:{{addr}}</h2>

<h2>学校名称:{{name}}</h2>

<button @click="showName">点我提示学校名</button>

</div>

`,data(){

return{

name:'尚硅谷',

addr:'北京'

}

},

methods: {

showName(){

console.log(this.name,this)

}

}

})

console.log('@',school)

new Vue({

el:'#root',

components: {

school

}

})

</script>

</body>

</html>

我们定义的组件本质上就是一个名为VueComponent的构造函数,我们在进行<school></school>的时候,vue会自动帮我们执行new VueComponent()

每次调用vue.extend(),放回的都是一个新的VueComponent,

在组件中,启动的this指向的是VueComponent,而在new Vue({})中的则是Vue

VueComponent Vue 联系

VueComponent.prototype.__proto===Vue.prototype ,VC能够同构隐式管理链能多去查找一步

VC也能去访问Vue原型上的属性、方法

也就是说,在Vue中添加的属性,VC通过隐式关系链就能访问到VM中的值

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

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

</head>

<body>

<div id="root">

<school></school>

</div>

<script type="text/javascript">

Vue.prototype.x=99

const school=Vue.extend({

template:`

<div>

<h2>学校地址:{{addr}}</h2>

<h2>学校名称:{{name}}</h2>

<button @click="showx">点我展示x</button>

</div>

`,data(){

return{

name:'尚硅谷',

addr:'北京'

}

},

methods: {

showx(){

console.log(this.x)

}

}

})

console.log('@',school)

const vm= new Vue({

el:'#root',

data:{

msg:'hello'

},

components: {

school

}

})

</script>

</body>

</html>


单文件组件

项目结构为

Student.vue与School.vue是我们创建的组件,App.vue是用于管理和引入这两个组件的,vm是在main.js中创建并且用于引入App.vue,index.html是文件的总入口和总div的创建

School.vue

<template>

<!-- 组件的结构 -->

<div class="demo">

<h2>学校名称:{{ name }}</h2>

<h2>学校地址:{{ addr }}</h2>

<button @click="showName">点我提示学校名称</button>

</div>

</template>

<script>

// 组件交互的代码

export default { //对外暴露

name:'School',//与vue文件命名一致

data() {

return {

name: '尚硅谷',

addr: '北京',

}

},

methods: {

showName() {

alert(this.name)

}

}

}

</script>

<style>

/* 组件的样式 */

.demo {

background: orange;

}

</style>

Student.vue

<template>

<div >

<h2>学生名称:{{ name }}</h2>

<h2>学生年龄:{{ age }}</h2>

</div>

</template>

<script>

export default {

name:'Student',

data() {

return {

name: '李四',

age:18

}

}

}

</script>

App.vue

<template>

<div>

<School></School>

<Student></Student>

</div>

</template>

<script>

//引入组件

import School from './School.vue'

import School from './Student.vue'

export default {

name:'App',

components:{

School,

Student

}

}

</script>

<style>

</style>

main.js

import App from './App.vue'

new VUe({

el:'#root',

template:`<App></App>`,

components: {

App

}

})

index.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<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>

</html>

相关推荐
GIS之路7 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug10 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213812 分钟前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中34 分钟前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路37 分钟前
GDAL 实现矢量合并
前端
hxjhnct40 分钟前
React useContext的缺陷
前端·react.js·前端框架
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全
前端工作日常1 小时前
我学习到的AG-UI的概念
前端