Animated Rainbow Nyan Cat

watch : ๊ฐ’์ด ๋ณ€ํ™”๋ ๋•Œ๋งˆ๋‹ค ์•Œ์•„์ฑ„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ.

์–ด๋–ค ์†์„ฑ์„ ๊ฐ์‹œํ•  ๊ฒƒ์ธ์ง€ ์ •์˜ํ•ด์•ผ ํ•จ.

watch: {
          // inputText ๊ฐ์‹œ
          inputText: function () {
            //console.log(this.forbiddenText);
            var pos = this.inputText.indexOf(this.forbiddenText);
            if (pos >= 0) {
              alert(this.forbiddenText + "๋Š” ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
              // ์ž…๋ ฅ๋ฌธ์ž์—์„œ ๊ธˆ์ง€ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
              this.inputText = this.inputText.substr(0, pos);
            }
          },

์—ฌ๊ธฐ์„œ๋Š” inputText๋ฅผ ๊ฐ์‹œํ•œ๋‹ค. ๋ณ€ํ™”ํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น function์ด ์ˆ˜ํ–‰๋œ๋‹ค.

methods: {
          cleanToDo: function () {
            this.todos = this.todos.filter(function (val) {
              return val.done == false;
            })
          }
      }

val.done์ด false์ธ ์• ๋“ค๋งŒ ๋‚จ๊ฒจ๋†“์Œ..

 

v-if : ํƒœ๊ทธ ์ž์ฒด๊ฐ€ ๋ Œ๋”๋ง ์•ˆ๋จ

v-show : ํƒœ๊ทธ๋Š” ๋ Œ๋”๋ง ๋จ

 

computed๋Š” ๋ณ€ํ™” ์ „ ๊ฐ’๊ณผ ํ›„ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ์ฒ˜๋ฆฌ๋Š” ํ•  ์ˆ˜ ์—†๋Š”๋ฐ watch์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

watch: {
	someObj: {
            handler: function (val, oldVal) {
              console.log(`[someObj] ${val}-${oldVal}`)
            },              
	},    
	'someObj.a' : {
            hadler: function (val, oldVal) {
                console.log(`[someObj.a] ${val}-${oldVal}`)
            },              
	},

์ด๋Ÿฐ์‹์œผ๋กœ ' '๋ฅผ ์ด์šฉํ•ด ์œ„๋ฐฐ๋˜์ง€ ์•Š๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

์ด๋•Œ someObj.a๊ฐ€ ๋ณ€ํ• ๋•Œ someObj๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ. ์™œ๋ƒํ•˜๋ฉด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์—. 

 

computed๋Š” ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ์•ˆ๋จ. ์•„๊ทœ๋จผํŠธ ๋ฐ›์„ ์ˆ˜ ์—†์Œ. ์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ๊ฑฐ ๋ถˆ๊ฐ€๋Šฅ. -> ๊ทธ๋Ÿด๋•Œ watch ์“ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ watch๋Š” ๊ฐ’์ด ๋ฐ”๋€”๋•Œ๋งŒ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ watch๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

watch: {
	someStr: {
		handler: function (val, oldVal) {
			console.log(`[someStr] ${val}-${oldVal}`)
		},
		immediate:true
 	},

 

์ด๋Ÿฐ์‹์œผ๋กœ immediate:true๋ฅผ ์จ์„œ ์ฆ‰์‹œ ์‹คํ–‰ watch๋ฅผ ์จ์ค€๋‹ค. ์ฆ‰์‹œ ์‹คํ–‰ watch๋Š” ์ฒ˜์Œ ๋ Œ๋”๋ง ๋ ๋•Œ๋„ ์‹คํ–‰๋œ๋‹ค.

 

methods๋Š” ํ˜ธ์ถœํ• ๋•Œ๋งˆ๋‹ค ๋ถˆ๋Ÿฌ์™€์ง€๋Š”๋ฐ computed๋Š” ํ˜ธ์ถœํ•ด๋„ ๊ฐ’์ด ๋ณ€ํ™”๊ฐ€ ์—†์œผ๋ฉด ํ˜ธ์ถœ ์•ˆํ•œ๋‹ค.

 

v-clock์„ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด์„ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ถˆ๋Ÿฌ์˜ฌ์ˆ˜ ์žˆ๋‹ค.

<style>
        [v-cloak]::before {
            content: '๋กœ๋”ฉ์ค‘...'
        }

        [v-cloak]>* {
            display: none;
        }
</style>

์ด๋Ÿฐ์‹์œผ๋กœ ์‹œ๊ฐ„์ด ๋˜๊ธฐ ์ „์—๋Š” '๋กœ๋”ฉ์ค‘'์ด๋ผ๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋œจ๊ฒŒํ•˜๊ณ  

<div id="app">
        <h1>v-cloak ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ํƒœ๊ทธ - {{msg}}</h1>
        <div v-cloak>
            <h1>v-cloak ์„ ์‚ฌ์šฉํ•œ ํƒœ๊ทธ - {{msg}}</h1>
        </div>
    </div>
    <script>
        setTimeout(function () {
            Vue.createApp({
                data() {
                    return {
                        msg: "hello"
                    }
                }
            }).mount("#app")
        }, 3000);
    </script>

div์— v-clock์„ ์ค˜์„œ ์‹œ๊ฐ„์ด ์ง€๋‚˜์•ผ ํƒœ๊ทธ๊ฐ€ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ css์™€ ์“ฐ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

์‹œ๊ฐ„์ด ๋˜๊ธฐ์ „์—๋Š” ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ณ 

์‹œ๊ฐ„์ด ๋˜๋ฉด ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

methods: {
        getAll: function () {
          axios.get("http://localhost:8088/boards")
            .then(response => {
              return response.data;
            }).
            then(boards => {
              let str = "";
              for (let elem of boards) {
                str += `<h3>${elem.boardNo}. ${elem.title}  ${elem.content}</h3>`;
              }
              this.result = str;
            })
            .catch(err => console.error(err));
        },

์ด๋Ÿฐ์‹์œผ๋กœ ajax๊ธฐ์ˆ ๋กœ rest api๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ajax์“ฐ๋ ค๋ฉด

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

์ด๋Ÿฐ์‹์œผ๋กœ ๋Œ์–ด์™€์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ cdn๋ฐฉ๋ฒ•์ด๋‹ค. cdn๋กœ๋”ฉ์œผ๋กœ ๋Œ์–ด์˜จ๋‹ค.

 

component

<div id="app">
		<my-comp-tag1></my-comp-tag1>
		<my-comp-tag2></my-comp-tag2>
		<my-comp-tag3></my-comp-tag3>
		<hr>
		<my-comp-tag1></my-comp-tag1>
	</div>
	<script>
		const { createApp } = Vue;

		const MyComponent1 = {
			template: '<p class="my-comp">์•ˆ๋…•? ๋‘˜๋ฆฌ~~</p>'
		}
		const MyComponent2 = {
			template: '<p class="my-comp">์•ˆ๋…•? ๋„์šฐ๋„ˆ~~</p>'
		}
		const MyComponent3 = {
			template: '<p class="my-comp">์•ˆ๋…•? ๋˜์น˜~~</p>'
		}
        createApp({
            components: {
                'my-comp-tag1': MyComponent1,
                'my-comp-tag2': MyComponent2,
                'my-comp-tag3': MyComponent3,
            }
		}).mount('#app');
	</script>

์ปดํฌ๋„ŒํŠธ ์“ธ๋•Œ ์ด๋Ÿฐ์‹์œผ๋กœ ์ •์˜ํ•ด์ค€๋‹ค.

 

createApp({
	components: {
		'my-component': MyComponent
	}

๊ด€๋ก€์ ์œผ๋กœ๋Š”, html์—์„œ ์‚ฌ์šฉํ• ๋•Œ๋Š” ์Šค๋„ค์ดํฌ ํ‘œ๊ธฐ๋ฒ•('my-component'), ๋’ค์—๊ฑฐ๋Š” ์นด๋ฉœ์ผ€์ด์Šค(MyComponent)๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

<div id="app">
			<my-component my-name="์˜๊ธ”"></my-component>
			<my-component my-name="๊ธ”๊ธ”"></my-component>
			<my-component></my-component>
		</div>
    <script>
      const  {createApp}  = Vue;
      const MyComponent = {
				template: '<p class="my-comp">๋‚˜๋Š” {{ myName }} ์ž…๋‹ˆ๋‹ค.</p>',
				props: {
					myName: String
				}
			}
			createApp({
				components: {
					'my-component': MyComponent
				}
			}).mount('#app');
    </script>

์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒŒ props๋ผ๋Š” ์„ค์ •. ์–ด๋–ค ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ๋ฐ›๊ฒ ๋‹ค.. ํ•˜๊ณ  ์ค€๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” String.. 

ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ• ๊นจ myName์„ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค ๋ผ๋Š” ๋œป. ์ „๋‹ฌ๋ฐ›๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋งŒํผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด๋ฆ„๊ทœ์น™์€ ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋กœ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ์‚ฌ์šฉํ• ๋•Œ๋Š” myName์ด๋Ÿฐ์‹์œผ๋กœ ์“ฐ์—ฌ์•ผ ํ•œ๋‹ค.

{{}}๋ฅผ ์ด์šฉํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค. 

๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ ๋ณธ๋‹ค๋ฉด

์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด์ธ๋‹ค.

 

'๐Ÿ’ผ Full-Stack Study โ‘ก (feat. KOSA)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vue.js (4)  (0) 2023.11.10
Vue.js (3)  (0) 2023.11.09
Vue.js  (0) 2023.11.06
ECMAScript6  (0) 2023.11.06
Spring Security, ES6  (1) 2023.11.03