Vue:propを介してサブコンポーネントにデータを渡し、サブコンポーネントイベントを傍受する
Propは、コンポーネントに登録できるカスタムプロパティです.値がpropプロパティに渡されると、そのコンポーネントインスタンスのプロパティになります.ブログコンポーネントにタイトルを渡すには、
1つのコンポーネントはデフォルトで任意の数のpropを持つことができ、任意の値は任意のpropに渡すことができます.上記のテンプレートでは、
Propが登録されると、このようにデータをカスタムプロパティとして渡すことができます.
しかし、典型的なアプリケーションでは、
各ブログのコンポーネントをレンダリングするには、次の手順に従います.
上記のように、
この
テンプレートでは、すべてのブログの番号を制御できます.
各ブログの本文の前にボタンを追加して、番号を拡大します.
同時に、サブコンポーネントは、組み込まれた
完全なサンプルコード:
以下を改造して、v-onでテキストを縮小する方法を追加します.
参考文献:基礎を築く——Vue.js
https://cn.vuejs.org/v2/guide/components.html
props
オプションを使用して、コンポーネントが許容できるpropリストに含めることができます.Vue.component('blog-post', {
props: ['title'],
template: '{{ title }}
'
})
1つのコンポーネントはデフォルトで任意の数のpropを持つことができ、任意の値は任意のpropに渡すことができます.上記のテンプレートでは、
data
の値にアクセスするように、コンポーネントインスタンスでこの値にアクセスできることがわかります.Propが登録されると、このようにデータをカスタムプロパティとして渡すことができます.
しかし、典型的なアプリケーションでは、
data
にブログの配列がある可能性があります.new Vue({
el: '#blog-post-demo',
data: {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
]
}
})
各ブログのコンポーネントをレンダリングするには、次の手順に従います.
上記のように、
v-bind
を使用してpropを動的に伝達できることがわかります.この
コンポーネントを再構築し、単独のpost
propを受け入れるようにします.
Vue.component('blog-post', { props: ['post'], template: `
{{ post.title }}
` })
监听子组件事件:
在我们开发
组件时,它的一些功能可能要求我们和父级组件进行沟通。例如我们可能会引入一个可访问性的功能来放大博文的字号,同时让页面的其它部分保持默认的字号。
在其父组件中,我们可以通过添加一个 postFontSize
数据属性来支持这个功能:
new Vue({
el: '#blog-posts-events-demo',
data: {
posts: [/* ... */],
postFontSize: 1
}
})
テンプレートでは、すべてのブログの番号を制御できます.
各ブログの本文の前にボタンを追加して、番号を拡大します.
Vue.component('blog-post', { props: ['post'], template: `
{{ post.title }}
` })
当点击这个按钮时,我们需要告诉父级组件放大所有博文的文本。我们使用v-on 监听子组件实例的任意事件:
同時に、サブコンポーネントは、組み込まれた
$emit
メソッドを呼び出し、イベント名を入力することによって、イベントをトリガーすることができる.
完全なサンプルコード:
import Vue from 'vue'
/* eslint-disable no-new */
Vue.component('blog-post', { // Prop
props: ['post'],
template: //
`
<div class="blog-post">
<h3>{{ post.title }}</h3>
<button v-on:click="$emit('enlarge-text')">
Enlarge text
</button>
</div>
`
})
export default {
name: 'HelloWorld',
data () {
return {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
],
postFontSize: 1,
}
}
}
以下を改造して、v-onでテキストを縮小する方法を追加します.
{{ msg }}
Essential Links
HelloVue
import Vue from 'vue'
/* eslint-disable no-new */
Vue.component('blog-post', { // Prop
props: ['post'],
template: //
`
<div class="blog-post">
<h3>{{ post.title }}</h3>
<button v-on:click="$emit('enlarge-text', 0.1)">
</button>
<button v-on:click="$emit('smaller-text', 0.1)">
</button>
</div>
`
})
export default {
name: 'HelloWorld',
data () {
return {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
],
postFontSize: 1,
msg: 'Welcome to Your Vue.js App'
}
}
}
参考文献:基礎を築く——Vue.js
https://cn.vuejs.org/v2/guide/components.html