0
0
Vueframework~20 mins

Custom refs with customRef in Vue - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Custom Ref Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this Vue component using customRef?
Consider this Vue 3 component using customRef to debounce input updates. What will be logged when the user types 'abc' quickly?
Vue
import { defineComponent, customRef } from 'vue';

export default defineComponent({
  setup() {
    const debounced = customRef((track, trigger) => {
      let timeout;
      let value = '';
      return {
        get() {
          track();
          return value;
        },
        set(newValue) {
          clearTimeout(timeout);
          timeout = setTimeout(() => {
            value = newValue;
            trigger();
            console.log('Value updated:', value);
          }, 200);
        }
      };
    });

    return { debounced };
  }
});
ALogs only 'Value updated: abc' once, 200ms after the last input
BLogs 'Value updated: a' immediately, then 'Value updated: abc' after 200ms
CLogs nothing because the debounce never triggers
DLogs 'Value updated: a', then 'Value updated: ab', then 'Value updated: abc' after 200ms each
Attempts:
2 left
💡 Hint
Think about how debounce delays the update until typing stops.
📝 Syntax
intermediate
2:00remaining
Which option correctly creates a customRef that logs on get and set?
Select the code snippet that correctly implements a customRef which logs 'Getting value' on get and 'Setting value' on set.
A
customRef((track, trigger) => {
  let value = 0;
  return {
    get() {
      track();
      console.log('Getting value');
      return value;
    },
    set(newVal) {
      value = newVal;
      trigger();
      console.log('Setting value');
    }
  };
})
B
customRef((track, trigger) => {
  let value = 0;
  return {
    get() {
      console.log('Getting value');
      track();
      return value;
    },
    set(newVal) {
      console.log('Setting value');
      value = newVal;
      trigger();
    }
  };
})
C
customRef((track, trigger) => {
  let value = 0;
  return {
    get() {
      track();
      return value;
      console.log('Getting value');
    },
    set(newVal) {
      value = newVal;
      trigger();
      console.log('Setting value');
    }
  };
})
D
customRef((track, trigger) => {
  let value = 0;
  return {
    get() {
      console.log('Getting value');
      return value;
      track();
    },
    set(newVal) {
      console.log('Setting value');
      trigger();
      value = newVal;
    }
  };
})
Attempts:
2 left
💡 Hint
Remember that track() must be called before returning the value in get, and trigger() after setting the value.
🔧 Debug
advanced
2:00remaining
Why does this customRef not trigger updates correctly?
This customRef is intended to debounce updates but Vue components don't react to changes. What is the problem?
Vue
const debounced = customRef((track, trigger) => {
  let value = '';
  let timeout = null;
  return {
    get() {
      track();
      return value;
    },
    set(newValue) {
      clearTimeout(timeout);
      timeout = setTimeout(() => {
        value = newValue;
        // Missing trigger call here
        console.log('Updated:', value);
      }, 300);
    }
  };
});
AThe value variable should be reactive using ref() inside customRef.
BThe track() function is missing in the get method, so reactivity is broken.
CThe trigger() function is not called after setting the value, so Vue does not know to update.
DThe timeout variable should be declared inside the set method, not outside.
Attempts:
2 left
💡 Hint
Check if Vue is notified when the value changes.
state_output
advanced
2:00remaining
What is the value of count after these operations with a customRef?
Given this customRef that doubles the value on set, what is the final value of count after these lines run?
count.value = 2;
count.value = 3;
Vue
import { customRef } from 'vue';

const count = customRef((track, trigger) => {
  let value = 0;
  return {
    get() {
      track();
      return value;
    },
    set(newVal) {
      value = newVal * 2;
      trigger();
    }
  };
});
A6
B3
C4
D0
Attempts:
2 left
💡 Hint
Remember the set multiplies the input by 2 before storing.
🧠 Conceptual
expert
2:00remaining
Which statement about Vue's customRef is true?
Choose the correct statement about customRef in Vue 3.
AcustomRef can only be used inside template expressions.
BcustomRef automatically makes the value deeply reactive without extra code.
CcustomRef replaces the need for computed properties in all cases.
DcustomRef allows you to customize how Vue tracks and triggers reactivity for a ref's value.
Attempts:
2 left
💡 Hint
Think about what customRef controls in Vue's reactivity.