ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

传递静态或动态 Prop

2022-06-04 19:04:20  阅读:183  来源: 互联网

标签:Vue title 静态 传入 hzh 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有