前端基础之组件

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

非单文件组件

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

相关推荐
lpfasd1233 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse4566 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai6 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记7 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁7 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu7 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!7 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格7 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人7 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid7 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet