当前位置: 首页 > 知识库问答 >
问题:

前端 - vue3中,在一个模板下,共用同一个组件,如何区分?

卫泉
2023-10-08

打个比方,有一个日期选择组件,然后表单中有2个输入框

<template><form>    <div>        <input name="start" @click="showCalenda">        <Calenda v-if="isShow" />    </div>    <div>        <input name="end" @click="showCalenda">        <Calenda v-if="isShow" />    </div></form></template><script setup>import { ref } from 'vue';import Calenda from './Calenda.vue';let isShow = ref(false)function showCalenda(){    isShow  = true}</script>

点击其中一个输入框,显示相对应日期选择组件,我该怎么写????除了将v-if用不同的属性外,有没有其他啥方法???

共有2个答案

澹台景辉
2023-10-08
<template>  <form>    <div>      <input name="start" @click="showCalendar('start')" />      <Calenda v-if="activeInput === 'start'" />    </div>    <div>      <input name="end" @click="showCalendar('end')" />      <Calenda v-if="activeInput === 'end'" />    </div>  </form></template><script setup>import { ref } from 'vue';import Calenda from './Calenda.vue';const activeInput = ref('');function showCalendar(inputName) {  activeInput.value = inputName;}</script>

**可以使用一个变量来记录当前点击的是哪个输入框,然后根据这个变量来决定哪个日期选择组件显示

**添加了一个名为activeInput的响应式变量,用于记录当前点击的输入框名称。当点击某个输入框时,调用showCalendar()方法,并将对应的输入框名称作为参数传递进去。showCalendar()方法会更新activeInput的值为相应的输入框名称。

**然后,我们使用v-if指令来判断activeInput的值,决定是否显示对应的日期选择组件。只有当activeInput的值与输入框名称匹配时,才会显示该日期选择组件。
通过这种方式,我们可以根据点击的输入框来显示相应的日期选择组件,而不是将两个日期选择组件都显示出来

祁兴运
2023-10-08

在你的例子中,你遇到的问题是两个输入框都共用了同一个组件 Calenda,并且都使用了相同的 isShow 引用。这样会导致无论你点击哪个输入框,都会显示同样的日期选择组件。

要解决这个问题,你需要为每个输入框分别维护一个独立的 isShow 引用。你可以通过使用 ref 来创建这些引用。以下是一种可能的解决方案:

<template><form>    <div>        <input name="start" @click="showCalenda(start)">        <Calenda v-if="startIsShow" />    </div>    <div>        <input name="end" @click="showCalenda(end)">        <Calenda v-if="endIsShow" />    </div></form></template><script setup>import { ref } from 'vue';import Calenda from './Calenda.vue';let startIsShow = ref(false);let endIsShow = ref(false);function showCalenda(isShowRef){    isShowRef.value = true;}</script>

在这个例子中,我为每个输入框创建了一个独立的 isShow 引用:startIsShowendIsShow。当你点击输入框时,showCalenda 函数接受相应的引用作为参数,并将其值设置为 true。这样,每个输入框就可以独立地控制与其关联的日期选择组件的显示了。

 类似资料:
  • 问题场景: 接到一个需求:类似于网站访问量计数的功能。 有一个全局变量 count 默认值为 0。 现在有 A 、B 、C 三个页面。 当 A 挂载完毕以后,执行 count++ ,B 挂载完以后 count ++, C同理 ... 现在我的解决方法是封装了一个函数,然后在这三个页面的 onMounted 里调取这个函数。 但是我又思考,��以后还会有 D E F 页面,那随着页面的增多,我就需要

  • 问题内容: 我可以在AngularJS 1.5组件中使用多个模板吗?我有一个具有一个属性的组件,因此我想基于该属性名称加载不同的模板。如何根据元素的属性名称加载模板? 谢谢。 问题答案: 我使用两种方法在1.5.x中制作组件的动态模板: 1)通过attr属性传递: 2)将服务注入模板并从那里获取模板: templateURL函数: 在getTemplate函数中,返回基于变量的模板URL 首先通过

  • 问题内容: 我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。 我应该如何在views.py中构建代码? 我这样做的原因是稍后将使用Ajax填充。我这样做对吗? 问题答案: 你可以做: 另一个Django模板在哪里。在这里,你可以放入将用Ajax获得的HTML。

  • 我这两个里面用了同一个组件 在检测里面重新渲染那个组件,点回详情里还是之前的数据,然后用watch $route,在离开详情页的时候组件会重新渲染,怎么做到在进入详情的时候就重新渲染呢?

  • 问题内容: 我想在相同的django模板中两次使用相同的{%block%}。我希望此块在我的基本模板中出现多次: 然后扩展它: 我将得到一个例外,因为Django希望该块仅出现一次: /的TemplateSyntaxError 名称为“ title”的“ block”标签出现了多次 一种快速而肮脏的解决方案是将块标题复制为title1和title2: 但这违反了DRY原则。因为我有很多继承模板,而

  • 问题内容: 我有一个包含一个按钮的标题组件,并且我希望该按钮在单击时显示另一个组件(模式页面)。 我可以做这样的事情: 这是我的标头组件: 这是我的模态页面组件,单击其他组件上的按钮时应显示该组件页面: 用于模态的库:https : //github.com/marcio/react-skylight 问题答案: 更像这样: 确保在子组件上公开一个方法: 基本上,这是在将SkyLight的方法包装