Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

watchEffect with a callback(without tracking) #4075

Open
4 tasks done
qzsiniong opened this issue Jul 2, 2024 · 0 comments
Open
4 tasks done

watchEffect with a callback(without tracking) #4075

qzsiniong opened this issue Jul 2, 2024 · 0 comments
Labels
enhancement New feature or request

Comments

@qzsiniong
Copy link

qzsiniong commented Jul 2, 2024

Clear and concise description of the problem

const same = ref(true); // is name2 must same of name1
const name1 = ref('1');
const name2 = ref('2'); // name2 not same of name1, although the same is true(because this  is from DB)

let first = true;
watchEffect(()=>{
  const _first = first;
  first = false;
  if (same.value) {
    const value1 = name1.value;

    if (!_first) {// not run when the first time
      name2.value = value1;
    }
  }
});

simple with the following

const same = ref(true); // is name2 must same of name1
const name1 = ref('1');
const name2 = ref('2'); // name2 not same of name1, although the same is true(because this  is from DB)


watchXXX(()=>{
  // tracking
  const isSame = same.value;
  const value1 = name1.value;

  // the callback without tracking, not call when options.immediate is false
  return () => {
    if (isSame) {
      name2.value = value1;
    }
  }
},{ 
  immediate: false // not run the callback when first
 });

Suggested solution

// It like watchEffect
function watchXXX(effect, options) {
  let count = 0;
  return watchEffect((cleanupFn) => {
    const _count = count  ;

    const doUnTrack = effect(cleanupFn);

    const immediate = options && options.immediate;
    if (immediate || _count>0) {
      withoutTracking(() => {
        doUnTrack(_count);
      });
    }
  }, options);
}

function withoutTracking(fn: () => void) {
  pauseTracking();
  try {
    fn();
  } catch (e) {
    throw e;
  } finally {
    resetTracking();
  }
}

use watchEffect
https://play.vuejs.org/#eNp9U01v2zAM/SucLkmALEaznTLH2Ady2A7bsPUoYLAdOVUrS4JEpxmC/PdSkh0bRduLZZPvPT6S8pl9sXZ17ATbsNzXTloEL7CzBdeytcYhnMGJZgmPJdZ3u6YRNS5BixPeyvoBLtA408KMFGZcc10b7UmhbAVsA2 OrhOLT0NCU Kmz8xuZotpfD3E1yHOtRIIjXSU3UJQIZGJh/l8sS3OXAMkhX8DNJ6EhSu5KZUPbADZwDx4Wx1LRbYg8geFGAvmoskEIVaCBOa7VONKg2Q7IYmXBGIhgEs46HEJzTedrlEaTf3RcOe9wuhk7DBp9tUpTENK0X7gY9vPq9PYIjIWpMJ5ltZJi6QPFK1VJQr6Asilth0C/rdiy1l9J qHypw4g P71uyFomDwxlkRjjyL8CKvXJboqqyEKnqVkROdk0pW5FkPeZmy2UtfVkrsr4WeqaxfUak6RJri51rRKAgbx0k26cQ8S1lC5tmkXbZk6GnDjTys7r3RdNHj/Khx01qphPtlw248Z5ths5yVSpnHHzEWNrMc4nFYL8TvPc1vQy /gyd3pJ6uOSzdIdgM6d3fn7TJSZLa7hSh30j Ed6oLnhMsK d3pPtCS66/R5/V6kPt353QqH90FQwGm9GxHNG/ q3N1of7X5YfRxuMbs8AQ4RX5g=

use watch
https://play.vuejs.org/#eNp9U7lu4zAQ/RWCjWVAa8HerbSysAdc7BZJkKRkI8mUw4QiCR6OA0P/nuGhWAiMNCI1b bNm4Nn/Fup1dFRXOLKdJopiwy1TtVEsEFJbdEZadrn6LWx3VM6dn1PO5sjmk5BT/aRdS9oRL2WA1oA4YIIIjopDBA2A0VbT5NZ7ejy5wQIANYJWawXy7l9M9k33k5ESJxly219JgIBZJ0WKNxRyFCG7 rYcEfzaA73dRnzzJARFIx5dvYBefIaJ2bWo8wDy4k8qInRoCl6AwHQAIsvhojeic4yKUAWdC9LoRc9EOcrD1EzMWCGsqM1tfBS4efE0IiY1aeE1FUR5wWTgh9LB8UbS EPoYoJ5Syyb4puCe6eaPfSyhPB6PhtkHvKwei1EVz7oyqCe121uojhvGkprxPLJSYoB5airorkcj2k3DPTtJzuPxJ9YtlcYwk8rbMW vir49AM8A4NBaFw2qqIKPhWxaxgnGNrYHN6dlg9Gylgl0MHoXQ5KMapvlV OobgchoqwQ3n8vV/sPnZpJVJ7bpifzbQwRIud16TPkJVH5ht9MHL9PDu4QZmOQOhcMfB wvwnhrJndcY3f44sQfZM7 g9l94kUwcHs3uZKkwU1FeaNiN4E8wvL /X5R kft99WPaZDy AyNYVn0=

use watchXXX
https://play.vuejs.org/#eNp9VNtu2kAQ/ZWRH4JRKE7SPlFj9aJUah/aqkmlPFiqjBnDhvWutRegIvx7Z3dt4yKUF9s713POjPcQfWya6dZiNItSXSrWGNBobJPlgtWNVAYOoLCawK4w5fq qrA0ExC4N4 s3MARKiVrGFGFUS5yUUqhqUJRI8xdXmyUxfH7ziHIcdt6Rrej8dB 19nvnD0XvuHT01Mcj fZIRcASQJGFeWGiZU7hlSmH0I313S6LbhFatd5/dl19J17twtQRFMJiMcwz8DXB2AVxKHguDNBABdSqVCo6FsAHN2LHsfJAdwnq2tcssLgDKqCa3SQhTSgrACzRigLzhfEAHZrFFAxpQ2lHZ1AuaisKA2TIkjtmGMrt2ycXbeYOBpiZ4UhNDceSEtlMKI4LjkWwjZfxJBfEOVPl 3f19etIJ17KX LR6czRQQEg2JnsT1him1RwtVV9znt3a1eXt8 5eWlhZLdDOTu28fB6VqetD6JQWYy/SecQtpdGqivddoHwubW0NcZ7AGZaQeDtd3n066dj5220kf6WVHfNAl/C/0ndDBYN5wo0QkgZaKxBszfBud5VK6x3CzkPo9g 6aWS RkdNjyKHOvNPHhWbpQSUjnxQJ51lY55XjkVCXJ0qQNuZwyWzJdLDgu 0ZnVe4uVfF1FtYY0vFDyUkMivaCElB6mzQJXopNkwHhaBIZTdtQsdX0WUtBN4lXkKjLumEc1Y8wsTyadVPOI/oR5O6bt7nZTDq7l uC/VmTgjP6 OkwqS2x6n2mUCsH07nvH77TLAdOIm45Rb/i/IVacuswhrBPViwJ9iDOo/3q70O6fB71/d6g0B0pBzQsZ BNl HnV6if4L6dvusukOj4D0yz1sM=

Alternative

No response

Additional context

No response

Validations

@qzsiniong qzsiniong added the enhancement New feature or request label Jul 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant