parent
a96c6c2109
commit
9f3180cfe7
4 changed files with 132 additions and 48 deletions
@ -0,0 +1,27 @@ |
|||||||
|
<template> |
||||||
|
<!-- 2. 通过v-model:参数名的方式传递数据 --> |
||||||
|
<ChildComponentA v-model:name="p_name" v-model:title="p_title"></ChildComponentA> |
||||||
|
<br> |
||||||
|
<label>这是父组件内容:</label> |
||||||
|
<p>名称:{{ p_name }}</p> |
||||||
|
<p>标题:{{ p_title }}</p> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import ChildComponentA from "@/components/ChildComponentA.vue"; |
||||||
|
|
||||||
|
export default { |
||||||
|
components: {ChildComponentA}, |
||||||
|
// 1. 定义用于互通的数据 |
||||||
|
data() { |
||||||
|
return { |
||||||
|
p_name: '父组件name数据', |
||||||
|
p_title: '父组件title数据', |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
|
||||||
|
</style> |
@ -0,0 +1,24 @@ |
|||||||
|
<template> |
||||||
|
<label>这是子组件内容:</label> |
||||||
|
<!-- 3. 使用$emit绑定事件并且回传参数 --> |
||||||
|
名称:<input type="text" :value="name" @input="$emit('update:name', $event.target.value)"/> |
||||||
|
标题:<input type="text" :value="title" @input="$emit('update:title', $event.target.value)"/> |
||||||
|
<p>名称是:{{name}}</p> |
||||||
|
<p>标题是:{{title}}</p> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
// 1. 子组件定义用于映射父组件数据的变量 |
||||||
|
props: { |
||||||
|
name: String, |
||||||
|
title: String, |
||||||
|
}, |
||||||
|
// 2. 注册自定义事件 |
||||||
|
emits: ['update:name', 'update:title'], |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
|
||||||
|
</style> |
@ -1,38 +1,60 @@ |
|||||||
<template> |
<template> |
||||||
<h3>{{ title }}</h3> |
<div class="wrap"> |
||||||
<ul> |
<div class="header"> |
||||||
<!-- 触发事件 --> |
<slot name="header">错误</slot> |
||||||
<li v-for="(item, index) in list_data" :key="index" @click="handleClick(item)">{{ index }} - {{ item }}</li> |
<div class="close">关闭</div> |
||||||
</ul> |
</div> |
||||||
|
<div> |
||||||
|
<slot :types="types"></slot> |
||||||
|
</div> |
||||||
|
<div class="footer"> |
||||||
|
<slot name="footer" :types="types" :sources="sources"></slot> |
||||||
|
</div> |
||||||
|
</div> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<script> |
<script> |
||||||
export default { |
export default { |
||||||
props: { |
data() { |
||||||
title: String, |
return { |
||||||
list_data: { |
types: { |
||||||
type: Array, |
404: 'Page Not Found', |
||||||
default: () => [], |
500: 'System Error', |
||||||
required: true, |
}, |
||||||
validator: value => { |
sources: { |
||||||
return value.length >= 0 |
system: '系统', |
||||||
|
page: '页面', |
||||||
|
console: '控制台', |
||||||
} |
} |
||||||
} |
} |
||||||
}, |
|
||||||
// 1. 注册自定义事件 |
|
||||||
emits: ['selected'], |
|
||||||
methods: { |
|
||||||
// 2. 封装一个本地发法,用于触发$emit, $emit格式为(自定义事件名称,参数) |
|
||||||
handleClick(item) { |
|
||||||
this.$emit("selected", item); |
|
||||||
} |
|
||||||
}, |
|
||||||
mounted() { |
|
||||||
console.log(this.list_data) |
|
||||||
} |
} |
||||||
} |
} |
||||||
</script> |
</script> |
||||||
|
|
||||||
<style scoped> |
<style scoped> |
||||||
|
.wrap { |
||||||
|
border: 1px solid #f66; |
||||||
|
color: #f66; |
||||||
|
padding: 10px; |
||||||
|
position: relative; |
||||||
|
max-width: 300px; |
||||||
|
} |
||||||
|
|
||||||
|
.header { |
||||||
|
font-size: 20px; |
||||||
|
color: #333; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.close { |
||||||
|
position: absolute; |
||||||
|
right: 10px; |
||||||
|
top: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.footer { |
||||||
|
color: #666; |
||||||
|
font-size: 12px; |
||||||
|
text-align: right; |
||||||
|
} |
||||||
</style> |
</style> |
||||||
|
Loading…
Reference in new issue