Skip to content

Conversation

@Haviles04
Copy link
Contributor

@Haviles04 Haviles04 commented Nov 19, 2025

Description

Fixes #22345

Disables activator when value === null or value === false, undefined is intentional, but at least this will give users a way to not show the tooltip conditionally

<template>
  <v-app>
    <v-container>
      <v-btn text="button with undefined tooltip" v-tooltip />
      <br>
      <v-btn text="button with null tooltip" v-tooltip="nullTooltip" />
      <br>
      <v-btn text="button with false tooltip" v-tooltip="false" @click="handleClick" />
      <br>
      <v-btn text="button without tooltip" />
    </v-container>
  </v-app>
</template>

<script setup>
  import { ref } from 'vue'
  const nullTooltip = ref(null)

  function handleClick () {
    nullTooltip.value = 'Changed'
  }
</script>

@Haviles04 Haviles04 changed the title Bug #22345 V-tooltip directive null or false value fix: #22345 V-tooltip directive null or false value Nov 19, 2025
@Haviles04 Haviles04 requested a review from a team November 19, 2025 17:07
export const Tooltip = useDirectiveComponent<TooltipDirectiveBinding>(VTooltip, binding => {
return {
activator: 'parent',
activator: (binding.value === null || binding.value === false) ? null : 'parent',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cannot be simplified to this? binding.value ? 'parent' : null

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was intentional, the default behaviors is that if you don't pass a value the tooltip will use whatever value the component has so if you have a button that says 'hello' the tooltip will also say 'hello'

I wanted to leave a way for that behavior to still work. But if you intentionally did not want to show it you could pass null or false

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add a comment or maybe change it to (anyone just checking the code can change it):

  • (binding.value === undefined || binding.value === true) ? 'parent': null or
  • (typeof binding.value === 'undefined' || binding.value === true) ? 'parent': null

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arggg: add a comment ;)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can get undefined, null, boolean, string or object
I think we don't want to show the tooltip for false, null and the empty string.

Copy link
Contributor

@J-Sek J-Sek Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyone against?

const textOrValue = isObject(binding.value) ? binding.value.text : binding.value
const disabled = ['', false, null].includes(textOrValue) // intentionally excluding undefined
return {
  activator: disabled ? null : 'parent',
  //...
}

Copy link
Contributor

@J-Sek J-Sek Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to avoid showing [Object object] when there is no text field (e.g. v-tooltip='{}').

const disabled = isObject(binding.value)
  ? !binding.value.text
  : ['', false, null].includes(binding.value) // undefined means true
return {
  activator: disabled ? null : 'parent',
  //...
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug Report][3.10.11] VTooltip with null or undefined value still show text on v-button (and empty tooltip with false value)

4 participants