IT/development

[Vue.js] watch vs computed(๋ฐ์ดํ„ฐ ๋ณ€ํ™” ๊ฐ์ง€)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2023. 7. 30.

๋ชฉ์ฐจ

    ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ๊ฐ์ง€ํ•˜๋Š” ์ ์€ ๋™์ผํ•˜์ง€๋งŒ ์šฉ๋„๊ฐ€ ๋‹ค๋ฆ„

    watch

    ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์›ํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

    • ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ ๋น„๋™๊ธฐ์  ๋กœ์ง ๋“ฑ ๋ณต์žกํ•œ ๋กœ์ง ์ˆ˜ํ–‰ ์‹œ ์‚ฌ์šฉ๋จ
    • ๋ณ€๊ฒฝ ์ „ ๋ฐ์ดํ„ฐ, ๋ณ€๊ฒฝ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    <div id="app">
      <p>์นด์šดํŠธ: {{ count }}</p>
      <button @click="increment">์ฆ๊ฐ€</button>
    </div>
    new Vue({
      el: '#app',
      data: {
        count: 0
      },
      methods: {
        increment() {
          this.count++;
        }
      },
      watch: {
    		//๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝ๋œ ๊ฐ’, ๋ณ€๊ฒฝ ์ „ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
        count(newValue, oldValue) {
          console.log('count๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ’: ${oldValue}, ์ƒˆ ๊ฐ’: ${newValue}');
    			//ajax ๋กœ์ง ์ƒ๋žต...
        }
      }
    });

    computed

    ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ/๊ฐ€๊ณตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

    • ์ž๋™ ์บ์‹ฑ ์ง€์›, ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต ํ›„ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋จ
    <div id="app">
      <p>๋ฐ˜์ง€๋ฆ„: <input type="number" v-model="radius"></p>
      <p>์›์˜ ๋„“์ด: {{ circleArea }}</p>
    </div>
    new Vue({
      el: '#app',
      data: {
        radius: 0
      },
      computed: {
        circleArea() {
          return Math.PI * this.radius * this.radius;
        }
      }
    });

    computed ์†์„ฑ์„ ์ด์šฉํ•œ ๋™์  ํด๋ž˜์Šค ์ฝ”๋“œ ์ž‘์„ฑ

    <div id="app">
    		<!-- class ๋ฐ”์ธ๋”ฉ์— computed return ๊ฐ’์„ ์—ฐ๊ฒฐ -->
        <p :class="errorTextcolor">Hello</p>        
    </div>
    new Vue({
        el: '#app',
        data: {
            isError: false  
        },  
        computed: {
            errorTextcolor: function() {
    						// isError์— this. ์•ˆ ๋ถ™์ด๋ฉด ๋ชป ์ฐพ์Œ
                return (this.isError ? 'warning' : null);
            }
        }
    });

    isError์˜ ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ computed ์†์„ฑ์— ์˜ํ•ด ๋™์ ์œผ๋กœ ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋จ

    ๋Œ“๊ธ€