FE/Vue.js

[ Vue 3 ] Reactivity

지니엠 2024. 5. 2. 18:01

 

 

 

 

 

 

Reactivity

 

reactivity.html 생성

 

<div id="app"></div>
<script>
  var data = {
    a: 10,
  };
</script>

data 라고 하는 변수를 선언, 객체화 하고 객체의 속성이 a 그리고 a에 10이라는 값을 집어넣었다.

 

 

위에는 가장 기본적인 js코드를 작성한 상태이고,

JavaScript API를 사용해볼텐데

Proxy를 사용해보자

 

 

Proxy

대리인, 대리 라는 뜻

redefine fundamental operations for that object

자바스크립트에서 프록시 객체는 대상객체를 감싸서, 속성 조회, 할당, 열거 및 함수 호출 등의 여러 기본동장을 가로채

특별한 다른동작을 가미시키는 대리자 역할을 한다.

get, set, has 등 메서드를 사용할 수 있다 

 

<div id="app"></div>
<script>
  var data = {
    a: 10,
  };

  new Proxy(data, { 
  
  })
</script>

new Proxy 선언하고, data라는 타겟값을 집어넣는다

첫번째 인자에 data, 위에서 선언한 객체를 넘긴거고,

두번째 인자에 data의 동작을 정의하는 새로운 인자를 넣을건데

여기서 정의할 수 있는게 set 혹은 get 이 있다.

 

 

 

<div id="app"></div>
<script>
  var data = {
    a: 10,
  };

  var app = new Proxy(data, { 
    get(){
    console.log('hi')
    }
  })
</script>

 

app의 내용이 바뀌게 되면 data의 내용도 같이 바뀌게 되는것이

new proxy라고 하는 API의 동작이다.

> 라이브서버로 화면 출력해보자

console창에서 app.a 를 입력하면 'hi'가 출력되는데,

new proxy가 data라고 하는 객체를 모방한 다음 동작을 추가했다고 보면 된다.

 

 

새로 쓰거나 변경하는걸 set() 진행해보자

<div id="app"></div>
<script>
  var data = {
    a: 10,
  };

  var app = new Proxy(data, {
    get() {
      console.log("값 접근");
    },
    set() {
      console.log("값 갱신");
    },
  });
</script>

위에 코드를 작성하고 저장, 다시 라이브서버를 봐보자

 

 

값 접근(get)과 값 갱신(set)의 값을 볼 수 있는데,

프록시를 통해서 객체의 동작을 정의할 수 있다는것을 확인 할 수 있다.

 

 

 

일단 mdn문서

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Proxy

https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model/Introduction

 

 

프록시를 통해 어떤 값에 접근하거나 변경했을때, 이걸 화면에서 출력되게 해보자

set을 통해 값에 접근해서 갱신할 수 있기때문에 set을 이용한다.

 

전체코드

<div id="app">
  <!-- 여기서 뭔가 렌더링 된다.-->
</div>

<script>
  var data = {
    message: 10,
  };
  function render(sth) {
    var div = document.querySelector("#app");
    // div tag에 접근할 수 있는 DOM API
    // DOM API : HTML 태그 정보를 접근 할 수 있는 기능
    div.innerHTML = sth;
  }

  var app = new Proxy(data, {
    get() {
      console.log("값 접근");
    },
    set(target, prop, newValue) {
      // handler.set의 기본 규격
      console.log("값 갱신");
      target[prop] = newValue;
      render(newValue);
    },
  });
</script>

 

1. message의 값을 지정해준다. ( 객체의 속성 )

2. 화면에 출력하기 위해서는 div를 사용해야 하고

3. render()함수를 사용 - document.querySelector을 이용 괄호안에 div의 id값 'app'를 넣어준다

4. div태그에 접근할 수 있는 도큐멘트쿼리셀렉터라고 하는 DOM API를 쓰게 된다.

5. var div 값에 넣고 -> div 태그는 html element를 의미하는것이다.

6. div.innerHTML을 이용해서 sth을 집어넣게 되면 render의 값이 화면(div태그)에 출력되게 된다.

7. set의 (target, property, value) 기본 규격을 이용한다.

8. target[prop] = value : 객체의 속성값에다가 새로운값(newValue)을 넣어준다.

9. render()에 새롭게 셋팅된값을 집어넣어주면 화면에 출력이된다.

 

 

 

 

 

위의 동작이 구현되는걸 그림으로 보자면 

 

 

내부동작은 vue에 위임을 하고 우리는 data로 선언해서 화면을 개발해나가면 되는것