在 HTML 中传递布尔 Vue 属性值

Posted

技术标签:

【中文标题】在 HTML 中传递布尔 Vue 属性值【英文标题】:Passing boolean Vue prop value in HTML 【发布时间】:2018-08-19 20:51:58 【问题描述】:

我对 Vue 还很陌生,并开始使用 vue-cli 进行项目。

我正在研究基于父级发送的道具的条件渲染。

Home.vue (父级)

<template>
    <Header have-banner="true" page-title="Home">

    </Header>
</template>

<script>
    import Header from "./Header";

    export default 
        components: 
            Header,
        ,
        name: "Home",
        data() 
            return 
                header: "Hello Vue!",
            ;
        ,
    ;
</script>

Header.vue (子)

<template>
    <header>
        <div v-if="haveBanner == 'true'">
            ...
        </div>
            ...
    </header>
</template>

我查看了另一种 conventional 方法来实现这一点,但 vue-cli 呈现模板的方式不同。

html 标记中传递道具时,道具 haveBanner 评估为字符串,因此,即使我这样做了:

父母

<Header have-banner="false"></Header>

孩子

<div v-if="haveBanner"`>
    ...
</div>

&lt;div&gt; 仍会显示,因此,我必须进行显式检查以查看其计算结果是否为 'true'。由于类型强制可能存在问题,我不喜欢这个,并且我收到了类型检查 (===) 的警告:

二进制操作参数类型字符串与类型字符串不兼容

有没有办法让孩子将此道具评估为布尔值,或者让父母在标记中将其作为布尔值传递?

【问题讨论】:

【参考方案1】:

如果传入布尔值或变量引用等JS关键字,则需要使用v-bind(或:),即:

<Header v-bind:have-banner="true" page-title="Home">

这将具有将布尔值true 绑定到道具的效果,而不是"true" 字符串。如果您不使用v-bind,则haveBanner 属性将始终为真,因为它是一个非零长度的字符串,无论您分配"true" 还是"false" 给它.

友情提示:HTML 标签不区分大小写,因此您可能希望使用custom-headermy-header-component 而不是Header

<custom-header v-bind:have-banner="true" page-title="Home">

查看概念验证:

Vue.component('custom-header', 
  template: '#customHeader',
  props: 
    haveBanner: Boolean,
    pageTitle: String
  
);

new Vue(
  el: '#app'
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.min.js"></script>

<div id="app">
  <custom-header v-bind:have-banner="true" page-title="Home"></custom-header>
  <custom-header v-bind:have-banner="false" page-title="Home"></custom-header>
</div>
 
<script type="text/x-template" id="customHeader">
    <header>
        <div v-if="haveBanner">
          <code>haveBanner</code> is true!
        </div>
        <div v-else>
          <code>haveBanner</code> is false!
        </div>
    </header>
</script>

专业提示:使用: 简写使您的模板更具可读性,即:

<custom-header :have-banner="true" page-title="Home">

【讨论】:

谢谢!我知道在孩子身上使用v-bind,但不知道在父母身上使用它 @Terry 很好的答案。【参考方案2】:

要将布尔类型用作道具,您必须使用 v:bind

<Header v-bind:have-banner="true" page-title="Home">

//or using a short syntax

<Header :have-banner="true" page-title="Home">

【讨论】:

以上是关于在 HTML 中传递布尔 Vue 属性值的主要内容,如果未能解决你的问题,请参考以下文章

vue基础中的注意事项,以及一些学习心得

vue数据来源

Vue.js 3 html 动态类基于计算属性传递参数

vue prop不写value的处理逻辑

复选框不适用于布尔视图模型属性

Vue组件中的jQuery插件:无法将值传递给prop