<div id="app">
<cpn>cpn>
<cpn>cpn>
<cpn>cpn>
div>
<div id="app2">
<cpn>cpn>
div>
<script src="../js/vue.js">script>
<script>
//1。创建组件构造器
const cpnC = Vue.extend({
template: `
我是标题
我是内容,哈哈哈
`
})
// 2.注册组件(全局组件, 意味着可以在多个Vue的实例下面使用)
// Vue.component('cpn', cpnC)
// 疑问: 怎么注册的组件才是局部组件了?
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
components: {
// cpn使用组件时的标签名
cpn: cpnC
}
})
const app2 = new Vue({
el: '#app2'
})
script>
是只能在父组件中被识别的
是会被浏览器忽略的 <div id="app">
<cpn2>cpn2>
div>
<script src="../js/vue.js">script>
<script>
// 1.创建第一个组件构造器(子组件)
const cpnC1 = Vue.extend({
template: `
我是标题1
我是内容, 哈哈哈哈
`
})
// 2.创建第二个组件构造器(父组件)
const cpnC2 = Vue.extend({
template: `
我是标题2
我是内容, 呵呵呵呵
`,
components: {
cpn1: cpnC1
}
})
// root组件
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
components: {
cpn2: cpnC2
}
})
script>
<div id="app">
<cpn1>cpn1>
<cpn2>cpn2>
div>
<script src="../js/vue.js">script>
<script>
//1.全局组件注册的语法糖
//1.创建组件构造器
//const cpn1=Vue.extend()
//2.注册组件
Vue.component("cpn1", {
template: `
我是标题1
我是内容,哈哈哈哈
`
})
//2.注册局部组件的语法糖
const app = new Vue({
el: "#app",
data: {
message: "你好啊"
},
components: {
"cpn2": {
template: `
我是标题2
我是内容,hhehe1
`
}
}
})
script>
标签
标签 <div id="app">
<cpn>cpn>
<cpn>cpn>
<cpn>cpn>
div>
<template id="cpn">
<div>
<h2>我是标题h2>
<p>我是内容,呵呵呵p>
div>
template>
<script src="../js/vue.js">script>
<script>
// 1.注册一个全局组件
Vue.component('cpn', {
template: '#cpn'
})
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
script>
解析:组件去访问message,message定义在Vue,我们发现最终并没有显示结果
结论:组件是不能直接访问Vue实例中的data数据
<div id="app">
<cpn>cpn>
<cpn>cpn>
<cpn>cpn>
div>
<template id="cpn">
<div>
<h2>{
{title}}h2>
<p>我是内容,呵呵呵p>
div>
template>
<script src="../js/vue.js">script>
<script>
//1.注册一个全局事件
Vue.component("cpn", {
template: "#app",
data() {
return {
title: "abc"
}
}
})
const app = new Vue({
el: "#app",
data: {
message: "你好啊",
}
})
script>
<div id="app">
<cpn>cpn>
<cpn>cpn>
<cpn>cpn>
div>
<template id="cpn">
<div>
<h2>当前计数:{
{counter}}h2>
<button @click="increment">+button>
<button @click="decrement">-button>
div>
template>
<script src="../js/vue.js">script>
<script>
//1.注册组件
const obj = {
counter: 0
}
Vue.component("cpn", {
template: "#cpn",
// data() {
// return {
// counter: 0
// }
// },
data() {
return obj
},
methods: {
increment() {
this.counter++
},
decrement() {
this.counter--
}
}
})
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
script>
<script>
// const obj = {
// name: 'why',
// age: 18
// }
//
// function abc() {
// return obj
// }
//
// let obj1 = abc()
// let obj2 = abc()
// let obj3 = abc()
//
// obj1.name = 'kobe'
// console.log(obj2);
// console.log(obj3);
script>
在下面的代码中,会将Vue实例当做父组件,并且其中包含子组件来简化代码
真实的开发中,Vue实例和子组件的通信和父组件和子组件的通信过程是一样的
<script>
Vue.component("my-component", {
props: {
//基础的类型检查(`null`匹配任何类型)
propA: Number,
//多个可能的类型
propB: [String, Number],
//必填的字符串
propC: {
type: String,
required: true
},
//带有默认值的数字
propD: {
type: Number,
default: 100
},
//带有默认值的对象
propE: {
type: Object,
//对象或数组默认值必须从一个工厂函数获取
default: function() {
return {
message: "hello"
}
}
},
//自定义验证函数
propF: {
validator: function(value) {
//这个值必须匹配下列字符串中的一个
return ["success", "warning", "danger"].indexOf(value) !== -1
}
}
}
})
script>
<script>
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName
}
Vue.component("blog-post", {
props: {
author: Person
}
})
script>
<div id="app">
<cpn @item-click="cpnClick">cpn>
div>
<template id="cpn">
<div>
<button v-for="item in categories"
@click="btnClick(item)">
{
{item.name}}
button>
div>
template>
<script src="../js/vue.js">script>
<script>
// 1.子组件
const cpn = {
template: '#cpn',
data() {
return {
categories: [{
id: 'aaa',
name: '热门推荐'
}, {
id: 'bbb',
name: '手机数码'
}, {
id: 'ccc',
name: '家用家电'
}, {
id: 'ddd',
name: '电脑办公'
}, ]
}
},
methods: {
btnClick(item) {
// 发射事件: 自定义事件
this.$emit('item-click', item)
}
}
}
// 2.父组件
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
components: {
cpn
},
methods: {
cpnClick(item) {
console.log('cpnClick', item);
}
}
})
script>