其他分享
首页 > 其他分享> > 传递静态或动态 Prop

传递静态或动态 Prop

作者:互联网

像这样,你已经知道了可以像这样给 prop 传入一个静态的值:

<blog-post title="My journey with Vue"></blog-post>
<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>传递静态或动态 Prop</title>
  <script src="./vue.js"></script>
</head>

<body>
  <div id="hzh">
    <hzh-component title="黄子涵"></hzh-component>
  </div>
  <script>
    Vue.component('hzh-component', {
      props: ['title'],
      template: '<h3>{{title}}</h3>'
    })

    new Vue({
      el: '#hzh', 
    })
  </script>
</body>

image

你也知道 prop 可以通过 v-bind 动态赋值,例如:

<!-- 动态赋予一个变量的值 -->
<blog-post v-bind:title="post.title"></blog-post>
<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>传递静态或动态 Prop</title>
  <script src="./vue.js"></script>
</head>

<body>
  <div id="hzh">
    <hzh-component v-for="post in posts" v-bind:key="post.id" v-bind:title="post.title"></hzh-component>
  </div>
  <script>
    Vue.component('hzh-component', {
      props: ['title'],
      template: '<h3>{{title}}</h3>'
    })

    new Vue({
      el: '#hzh',
      data: {
        posts: [
          { id: 1, title: '黄子涵' }
        ]
      }
    })
  </script>
</body>

image

<!-- 动态赋予一个复杂表达式的值 -->
<blog-post
  v-bind:title="post.title + ' by ' + post.author.name"
></blog-post>
<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>传递静态或动态 Prop</title>
  <script src="./vue.js"></script>
</head>

<body>
  <div id="hzh">
    <hzh-component v-for="post in posts" v-bind:key="post.id" v-bind:title="post.title + '由' + post.author.name + '创作'"></hzh-component>
  </div>
  <script>
    Vue.component('hzh-component', {
      props: ['title'],
      template: '<h3>{{title}}</h3>'
    })

    new Vue({
      el: '#hzh',
      data: {
        posts: [
          { id: 1, title: '《黄子涵是帅哥!》', author: {name: '黄子涵'}}
        ]
      }
    })
  </script>
</body>

image

在上述两个示例中,我们传入的值都是字符串类型的,但实际上任何 类型的值都可以传给一个 prop。

传入一个数字
传入一个布尔值
传入一个数组
<!-- 即便数组是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post v-bind:comment-ids="[234, 266, 273]"></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:comment-ids="post.commentIds"></blog-post>
传入一个对象
<!-- 即便对象是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post
  v-bind:author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:author="post.author"></blog-post>
传入一个对象的所有 property

如果你想要将一个对象的所有 property 都作为 prop 传入,你可以使用不带参数的 v-bind (取代 v-bind:prop-name)。例如,对于一个给定的对象 post

post: {
  id: 1,
  title: 'My Journey with Vue'
}

下面的模板:

<blog-post v-bind="post"></blog-post>

等价于:

<blog-post
  v-bind:id="post.id"
  v-bind:title="post.title"
></blog-post>

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

这里有两种常见的试图变更一个 prop 的情形:

  1. 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。
    在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:
props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}
  1. 这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:
props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}
警告

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

标签:Vue,title,静态,传入,hzh,prop,传递,组件,Prop
来源: https://www.cnblogs.com/Huang-zihan/p/16342430.html