在 Vue 3 中使用单选按钮显示或隐藏 div

Use radio button to show or hide divs in Vue 3

在我的 Vue 3.0.5 应用程序 中,我想通过单选按钮在 <div> 个元素之间切换,即一次只显示一个元素。如果我在输入元素中的 value 参数前面加上 v-bind,它会起作用,尽管我已经用 v-model 分配了值。但是,我不明白为什么。

我还使用单选按钮 select 来获得 ascending/descending 订单(我实现了一个 computed 排序函数,它使用 asc/desc 的变量):这有效没有 v-bind.

我不清楚行为为何不同。谁能解释一下?

示例 v-bind

<!DOCTYPE html>
<html>
  <head>
    <script src="https://unpkg.com/vue@3.0.5"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <label><input type="radio" v-model="showFirst" v-bind:value="true" checked />First View</label>
        <br />
        <label><input type="radio" v-model="showFirst" v-bind:value="false" />Second View</label>
      </div>
      {{ showFirst }}

      <div v-if="showFirst">First view</div>
      <div v-else>Second view</div>
    </div>

    <script>
      var app = Vue.createApp({
        data() {
          return {
            showFirst: true,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>
</html>

示例没有 v-bind

<!DOCTYPE html>
<html>
  <head>
    <script src="https://unpkg.com/vue@3.0.5"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <label><input type="radio" v-model="showFirst" value="true" checked />First View</label>
        <br />
        <label><input type="radio" v-model="showFirst" value="false" />Second View</label>
      </div>
      {{ showFirst }}

      <div v-if="showFirst">First view</div>
      <div v-else>Second view</div>
    </div>

    <script>
      var app = Vue.createApp({
        data() {
          return {
            showFirst: true,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>
</html>

v-model:modelValue=""@update:modelValue="" 的双向绑定 shorthand。在 Vue 2 中,它曾经是 :value=""@input=""。您应该只使用 v-model 或另一个。

当您添加 属性 value="true" 时,这意味着您将字符串 "true" 作为值传递给组件。在 value 之前使用冒号时,您传递了一个计算结果为一个值的表达式。所以,添加 :value="true" 实际上传递给被评估的表达式,它是一个布尔值(它也可以是一个变量,一个计算等)。 v-bind: 等于一个冒号 :,通常使用缩写

另见 docs to v-model from Vue

问题不在于您没有绑定该值,而是该值未设置为布尔值。如果您使用 v-bind 然后它会转换为布尔值。

所以你应该使用v-bind:value="true"(或shorthand`:value="true")

否则,你可以 v-if="showFirst === 'true'" 或者,为了好玩,使用数字值进行创意(输入:value="0" 然后 v-if:Boolean(parseInt(showFirst))

例子

  var app = Vue.createApp({
    data() {
      return {
        showFirst: true,
      };
    },
  });

  app.mount("#app");
<script src="https://unpkg.com/vue@3.0.5"></script>
<div id="app">
  <div>
    <label><input type="radio" v-model="showFirst" value="true" />First View</label
    ><br />
    <label><input type="radio" v-model="showFirst" value="false" />Second View</label>
  </div>
  {{ showFirst }}

  <div v-if="showFirst === 'true'">First view</div>
  <div v-else>Second view</div>
</div>