基础组件

Vue.js 曹卷英

通过事件向父组件发送消息:

在我们开发 <blog-post>(博客贴子) 组件时,它的一些功能可能要求我们和父级组件进行沟通。

例如我们可能会引入一个可访问性的功能来放大博文的字号,同时让页面的其它部分保持默认的字号。

1.在其父组件中,我们可以通过添加一个 postFontSize 数据属性来支持这个功能:

new Vue({
  el: '#blog-posts-events-demo',
  data: {
    posts: [/* ... */],//里面写自定义内容
    postFontSize: 1 
  }
})

2.它可以在模板中用来控制所有博文的字号:

<div id="blog-posts-events-demo">
  <div :style="{ fontSize: postFontSize + 'em' }">
    <blog-post
      v-for="post in posts"
      v-bind:key="post.id"
      v-bind:post="post"
    ></blog-post>
  </div>
</div>

3.现在我们在每篇博文正文之前添加一个按钮来放大字号:

Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <button>
        Enlarge text
      </button>
      <div v-html="post.content"></div>
    </div>
  `
})

4.问题是这个按钮

<button>
    扩大 文本
</button>

5.当点击这个按钮时,我们需要告诉父级组件放大所有博文的文本。幸好 Vue 实例提供了一个自定义事件的系统来解决这个问题。我们可以调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件:

<button v-on:click="$emit('enlarge-text')">
  扩大文本
</button>

6.然后可以用v-no在博文组件上监听这个事件,就像监听一个原生 DOM 事件一样:

<blog-post
  ...
  v-on:enlarge-text="postFontSize += 0.1"  绑定事件
></blog-post>

7.我用这些知识例了一个小的案列:

案例代码如下:

html代码:

<div id="blog-posts-events-demo" class="demo">
    <div :style="{ fontSize: postFontSize + 'em' }">
        <blog-post v-for="post in posts" v-bind:key="post.id" v-bind:post="post"
              v-on:enlarge-text="postFontSize += 0.1">
        </blog-post>
     </div>
</div>

js代码:

 <script>
            //子组件的写法
              Vue.component('blog-post', {
                props: ['post'],
                template: '\
                  <div class="blog-post">\
                    <h3>{{ post.title }}</h3>\
                    <button v-on:click="$emit(\'enlarge-text\')">\
                      扩大 文本\
                    </button>\
                    <div v-html="post.content"></div>\
                  </div>\
                '
              })
              new Vue({
                el: '#blog-posts-events-demo',
                data: {
                  posts: [
                    { id: 1, title: '我是粗', content: '...我是细...' },
                    { id: 2, title: '我是粗', content: '...我是细...' },
                    { id: 3, title: '我是粗', content: '...我是细...' }
                  ],
                  postFontSize: 1 //字体大小
                }
              })
    </script>

案例的效果如下:

搜狗截图20180901122540.png


2.使用事件抛出一个值

1.有的时候用一个事件来抛出一个特定的值是非常有用的。例如我们可能想让 <blog-post>组件决定它的文本要放大多少。这时可以使用 $emit 的第二个参数来提供这个值:

<button v-on:click="$emit('enlarge-text', 0.1)">
  扩大文本
</button>

2.然后当在父级组件监听这个事件的时候,我们可以通过 $event 访问到被抛出的这个值:

<blog-post
  ...
  v-on:enlarge-text="postFontSize += $event">
</blog-post>

3.或者,如果这个事件处理函数是一个方法:

<blog-post
  ...
  v-on:enlarge-text="onEnlargeText">
</blog-post>

4.那么这个值将会作为第一个参数传入这个方法:

methods: {
  onEnlargeText: function (enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}

到目前为止我对vue组件之间的传值,和使用事件抛出一个值了解的就这么多。

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :