vue.jsDay5

02-全局组件和局部组件的使用
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
            <cpn></cpn>
		</div>
		<script src="../js/vue.js"></script>
        <script type="text/javascript">
        //ES6 ``
        //1创建组件构造器对象
        //extend创建一个组件构造器 通常在创建组件构造器时,传入template代表我们自定义组件的模板
        //该模板就是在使用组件的地方,要显示的HTML代码
         const cpnc = Vue.extend({
             template:`
             <div>
                <h2>我是哈哈哈</h2>
             </div>
             `
         })
        //2.注册组件(全局组件 ,意味着可以在多个vue的实例下面使用)
        //怎么注册的组件才是局部组件
        Vue.component('cpn',cpnc)
        
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				},
                component:{
                    cpn:cpnc
                }
			})
		</script>
	</body>
</html>

当我们通过调用Vue.component()注册组件时,组件的注册时全局的
如果我们注册的某个组件时挂载在,某个实例中, 那么就是一个局部组件

03父组件和子组件
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
           <cpn2></cpn2>
		</div>
		<script src="../js/vue.js"></script>
        <script>
            //1.创建第一个组件(子组件)
            const cpnc1 = Vue.extend({
                template:`
                <div>
                    <h2>我是标题1</h2>
                    <p>哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</p>
                </div>`
            })

            //2创建第二个组件构造器(父组件)
            const cpnc2 = Vue.extend({
                template:`
                <div>
                    <h2>我是标题2</h2>
                    <p>红红火火恍恍惚惚呵呵哈哈哈呵呵哈哈哈哈哈哈哈呵呵哈哈哈</p>
                    <cpn1></cpn1>
                </div>`,
                components:{
                    cpn1:cpnc1
                }
            })
            //root组件
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				},
                components: {
                    cpn2:cpnc2
                }
			})
		</script>
	</body>
</html>

组件和组件之间存在层级关系 而其中一种非常重要的关系就是父子组件的关系

父子组件的错误用法,以子标签的形式在Vue实例中使用
因为当子组件注册到父组件的component中时Vue会编译好父组件的模块
该模板的内容已经决定了父组件将要渲染的HTML (相当于父组件中已经有了子组件中的内容了)
是只能在父组件中被识别的
类似这种用法,是会被浏览器忽略的

组件的语法糖注册方式
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
            <cpn1></cpn1>
			<cpn2></cpn2>
            
		</div>
		<script src="../js/vue.js"></script>
        <script type="text/javascript">
        //1.全局组件注册的语法糖
        //2.创建组件构造器
        // const cpnc1 = Vue.extend()
        //2.注册组件 
        Vue.component('cpn1',{
                template:`
                <div>
                    <h2>我是标题1</h2>
                    <p>哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</p>
                </div>`
            })
        //注册局部组件的语法糖
        //Vue为了简化这个过程,提供了注册的语法糖
        //主要是省去了调用Vue.extend()步骤,而是可以直接使用一个对象来代替
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				},
                components:{
                'cpn2':{
                        template:`
                        <div>
                            <h2>我是标题1</h2>
                            <p>呵呵呵呵</p>
                        </div>`
                    }
                }
			})
		</script>
	</body>
</html>

Vue为了简化注册方式,提供了语法糖
主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替

组件模板的分离写法

刚才,我们通过语法糖简化了Vue组件的注册过程,另外还有一个地方的写法比较麻烦,就是tamplate模板写法
如果我们能将其中的HTML代码抽离出来,然后挂载到对应的组件上,必然结构会变得非常清晰
Vue提供了两种方案来定义HTML模板的内容
1,使用script标签
2,使用template标签

在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
            <cpn></cpn>
        </div>
        <!-- 1  script标签-->
        <!-- <script type="text/x-template" id="cpn">
            <div>
                <h2>我是标题哈哈哈</h2>
                 <p>我是内容呵呵呵</p>
            </div>
        </script> -->
        <!-- 2.template标签 -->
        <template id="cpn">
            <div>
                <h2>我是标题哈哈哈</h2>
                 <p>呵呵呵呵呵</p>
            </div>
        </template>
		<script src="../js/vue.js"></script>
        <script type="text/javascript">
        Vue.component('cpn',{
            template:'#cpn'
        })
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				}
			})
		</script>
	</body>
</html>
组件中的数据存放问题
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
            <cpn></cpn>
        </div>
        <template id="cpn">
            <div>
                <h2>{{title}}</h2>
                 <p>呵呵呵呵呵</p>
            </div>
        </template>
		<script src="../js/vue.js"></script>
        <script type="text/javascript">
        Vue.component('cpn',{
            template:'#cpn',
            data(){
                return{
                    title:'avc'
                }
            }
        })
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				}
			})
		</script>
	</body>
</html> 

组件中的数据存放在哪里呢
组件对象也有一个data属性(也可以有methods等属性,下面我们有用到)
只是这个data属性必须是一个函数
而且这个函数返回一个对象,对象内部保存着数据
在这里插入图片描述

为什么data是一个函数
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
            <cpn></cpn>
            <cpn></cpn>
            <cpn></cpn>
        </div>
        <template id="cpn">
           <div>
               <h2>当前计数  {{count}}</h2>
               <button @click = 'btn'>+</button>
               <button @click = 'btns'  v-bind:disabled = "count <= 1">-</button> </button>
           </div>
        </template>
		<script src="../js/vue.js"></script>
        <script type="text/javascript">
        //1注册组件
            Vue.component('cpn',{
                template:'#cpn',
                data(){
                    return {
                        count:0
                    }
                },
                methods:{
                    btn(){
                        this.count++
                    },
                    btns(){
                        this.count--
                    }
                }
            })
			const app = new Vue({
				el:'#app',
				data:{
					message:"你好!"
				},
			})
		</script>
	</body>
</html> 

我们用了计算加减案例来具体说明
首先,如果不是一个函数,Vue就会直接报错
其次,愿意是在于Vue让每个组件对象都返回一个新的对象,因为如果是同一个对象的,组件在多次使用的时候就会受影响

父组件对子组件的传递
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
           <cpn :mess = 'message' :cmoves = 'moves'></cpn>
        </div>
        
        <template id="tam">
            <div>
                <li v-for = 'item in cmoves'>{{item}}</li>
                <h2>{{mess}}</h2>
            </div>
        </template>
		<script src="../js/vue.js"></script>
        <script>

            //2创建第二个组件构造器(父组件)
            //父传子 : props
            const cpn = Vue.extend({
                template: '#tam',
                // props:['cmoves','mess']  //传递数组方式
                props:{
                    //类型的限制
                    // cmoves:Array,
                    // mess:String,
                    //2提供一些默认值,以及必传值
                    mess:{
                        type:String,
                        default:'aaa',
                        required:true
                    },
                    //类型是对象或者数组时,默认值必须是一个函数
                    cmoves:{
                        type:Array,
                        default(){
                            return {}
                        }//vue2.5.2以下这样的写法都是不会错
                    }
                }
            })



			const app = new Vue({
				el:'#app',
				data:{
                    message:"你好!",
                    moves :['海王','海贼王','海尔兄弟']
				},
                components: {
                    cpn
                }
			})
		</script>
	</body>
</html>

在上衣节中,我们提到了子组件是不能引用父组件或者Vue实例的
但是,在开发中,往往一些数据确实需要从上层传递到下层
比如在一个页面中,我们从服务器请求到了数据
其中一部分数据,并非是我们整个页面的大组件来展示的,而是需要下面的子组件进行展示
这个时候,并不会让子组件再次发送一个网络请求,而是直接让大组件把数据传递给小组件

我们可以通过props向子组件传递数据
通过事件向父组件发送消息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue.component和vue.use都是Vue.js中的方法,但是它们的作用不同。 vue.component用于注册全局组件,可以在任何Vue实例中使用。例如: ``` Vue.component('my-component', { // 组件选项 }) ``` 而vue.use用于安装Vue.js插件,可以在Vue实例中使用插件提供的功能。例如: ``` Vue.use(myPlugin) ``` 其中myPlugin是一个Vue.js插件,它需要提供一个install方法。在install方法中,可以注册全局组件、指令、混入等。例如: ``` const myPlugin = { install(Vue, options) { // 注册全局组件 Vue.component('my-component', { // 组件选项 }) // 注册全局指令 Vue.directive('my-directive', { // 指令选项 }) // 注册全局混入 Vue.mixin({ // 混入选项 }) } } ``` 总之,vue.component用于注册全局组件,vue.use用于安装Vue.js插件。 ### 回答2: 在Vue.js框架中,Vue.component和Vue.use都是用于组件注册的方法。但它们之间有一些区别。 Vue.component是Vue.js用于定义全局或局部组件的方法,可以在全局或局部范围内注册一个组件,使之在应用中可以被多个组件使用。它接收两个参数:第一个参数是组件的名字,第二个参数是一个选项对象,如下: ``` Vue.component('my-component', { // 组件选项 }) ``` Vue.use是Vue.js插件的方法,用于在全局范围内注册Vue插件。Vue插件通常是通过一个对象或一个函数暴露出来,该对象或函数要具有一个install方法。使用Vue.use可以安装插件并将该插件自动注册到Vue实例的所有组件中。使用Vue.use时,必须将插件作为参数传递给Vue.use方法,如下: ``` // 引入插件 import MyPlugin from 'path/to/MyPlugin.js' // 安装插件 Vue.use(MyPlugin) ``` 总之,Vue.component和Vue.use都是用于组件注册的方法,但Vue.component用于组件的定义和注册,Vue.use则用于全局插件的注册和安装,二者的用途和效果不同。 ### 回答3: Vue.js是一款非常流行的JavaScript框架,它提供了很多有用的特性和工具来方便我们开发Web应用程序。Vue.js中常用的两个API是vue.component和vue.use。它们都是以插件的形式来扩展Vue.js的功能。虽然它们有一些相似之处,但是也有一些不同之处。本文将从多个方面对它们进行比较,以便更好地理解它们的作用和用法。 1、作用 vue.component的作用是注册一个全局或局部组件。这个组件可以被其他组件或者模板文件引用。我们可以为组件设置属性(prop)和事件(event),并可以在组件中使用响应式的数据。这样可以实现组件的代码重用和灵活性。 vue.use的作用是注册一个Vue.js插件。插件是一个包含了一些预置功能的JavaScript对象,可以扩展Vue.js的全局或局部功能。插件一般包含了一些全局的属性、指令、组件以及一些工具方法。使用插件可以方便地扩展Vue.js的功能,而且插件还可以被其他开发者共享和复用。 2、用法 vue.component的用法: 全局注册 Vue.component('component-name', { // options }) 局部注册 new Vue({ // ... components: { 'component-name': { // options } } }) vue.use的用法: Vue.use(plugin) 3、调用方式 vue.component 全局组件可以直接在任何地方使用,局部组件只能在注册组件的实例或其子组件中使用。 vue.use 插件可以在Vue根实例之前调用,也可以在Vue根实例之后调用。在调用use方法之后,插件会被安装并立即生效。插件通常是全局可用的,可以在Vue的组件中使用。 4、局限性 vue.component 局部注册的组件不可以在父级组件中使用,只能在父级组件的模板中使用。此外,全局组件也有可能会被其他库或者开发者使用同样的名称而冲突。 vue.use 由于插件本质上是一个JavaScript对象,因此插件可以被修改或覆盖。此外,插件还必须暴露一个install方法,否则使用use安装插件时会报错。 总结: vue.component是Vue.js的组件注册方法,用于注册全局或局部的组件,以实现组件的代码复用和灵活性。 vue.use是Vue.js的插件注册方法,用于注册插件以扩展Vue.js的全局或局部功能,以方便开发者开发和复用Vue.js的扩展功能。 两个API虽然有很多相似之处,但是在实际使用中也存在很多不同之处。了解这些差异和各自的用法可以帮助我们更好地使用Vue.js,提高开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值