출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

stackoverflow.com/questions/53764367/how-to-trigger-hover-programmatically-in-chartjs

 

How to trigger hover programmatically in chartjs

I want to set the hover effect in ChartJs programmatically i wish to see both effects hoverBorderWidth, and hoverBorderColor. I know how to activate some tooltips, but I can't apply hover effects. ...

stackoverflow.com

hyung1.tistory.com/17

 

chart.js 로 그래프 그리기

chart.js 를 활용하여 그래프를 그리는 작업을 했다. (chart.js 링크: https://www.chartjs.org/) 기본 bar 그래프를 사용하면 좋으려만 디자인은 그렇게 나오지 않았기에..... 그리하여 이번에 작업하면서 사

hyung1.tistory.com

jsfiddle.net/kf9uLf3x/

 

Edit fiddle - JSFiddle - Code Playground

 

jsfiddle.net

let c = new Chart($('#chart'), {
  type: 'doughnut',
  data: {
    labels: ['a', 'b', 'c', 'd'],
    datasets: [{
      data: [1, 2, 4, 8],
      backgroundColor: ['red', 'blue', 'green', 'orange']
    }]
  },
  options: {
    maintainAspectRatio: false
  }
});
$('#a').on('click', function() { t(0); });
$('#b').on('click', function() { t(1); });
$('#c').on('click', function() { t(2); });
$('#d').on('click', function() { t(3); });

function t(idx) {
  var meta = c.getDatasetMeta(0),
    rect = c.canvas.getBoundingClientRect(),
    point = meta.data[idx].getCenterPoint(),
    evt = new MouseEvent('mousemove', {
      clientX: rect.left + point.x,
      clientY: rect.top + point.y
    }),
    node = c.canvas;
  node.dispatchEvent(evt);
}

 

 

 

위의 코드들을 참조해서

1) 마우스 오버가 아닌 클릭시 툴팁이 팝업되는 형식으로 수정 하고

2) 원하는 칼럼(?)을 클릭하는 이벤트를 만들어줌 (내 경우에는 첫번째인 [0]번)

ㅡ.ㅡ 이거하려고 무슨 chartjs 외부트리거 등등 엄청 찾았네..

여기서 포인트는 options -tooltip의 intersect를 false로 해주는 것이다.

function fn_make_chart_doughnut2(idNm, data, labels, legend_position, tooltipSign){
	if(legend_position == null) legend_position = 'top';
	if(tooltipSign == null) tooltipSign = '%';

	let ctx = document.getElementById(idNm);

	let chart_data = {
		datasets: [{
			data: data,
			backgroundColor: chart_colors,
			hoverBackgroundColor: chart_colors_hover,
			hoverBorderColor: "rgba(234, 236, 244, 1)",
		}],

		// These labels appear in the legend and in the tooltips when hovering different arcs
		labels: labels
	};

	let options = {
		events: ["click"],
		hover: {
			mode: 'nearest'
		},

		maintainAspectRatio: false,
		tooltips: {
			intersect: false,
			backgroundColor: "rgb(255,255,255)",
			bodyFontColor: "#858796",
			borderColor: '#dddfeb',
			borderWidth: 1,
			xPadding: 15,
			yPadding: 15,
			displayColors: true,
			caretPadding: 20,
			callbacks: {

				label: function(tooltipItem, chart) {
					let datasetLabel = chart.labels[tooltipItem.index] || '';
					let rateArr = fn_get_rateArrByList(chart.datasets[0].data, null);
					let rate = rateArr[tooltipItem.index];
					return datasetLabel+ ', ' +rate + " %";

				}
			}
		},
		title: {
			display: false,
			position: 'top',
			fontSize: 40,
			fontColor: "#858796",
			text: ""
		},
		layout: {
			padding: {
				top: 0,
				bottom: 0
			}
		},
		legend: {
			display: true,
			position: legend_position,
			labels: {
				padding: 10,
				boxWidth:12
			}
		},
		rotation:  1.2 * Math.PI,
		cutoutPercentage: 75,	//도넛 구멍 크기
	};

	let myDoughnutChart = new Chart(ctx, {
		type: 'doughnut',
		data: chart_data,
		options: options
	});

	return myDoughnutChart;
}
    function click_first_column() {
        var meta = doughnutRstChart.getDatasetMeta(0),
            rect =doughnutRstChart.canvas.getBoundingClientRect(),
            point = meta.data[0].getCenterPoint(),
            evt = new MouseEvent('click', {
                clientX: rect.left + point.x,
                clientY: rect.top + point.y
            }),
            node = doughnutRstChart.canvas;
        node.dispatchEvent(evt);
    }

    public String makeComma(int val){
        DecimalFormat Commas = new DecimalFormat("#,###");
        String rst = (String)Commas.format(val);

        return rst;

ifuwanna.tistory.com/241

 

[IntelliJ] 필수 단축키 정리 (+ 전체 단축키 표)

인텔리J(IntelliJ IDEA) 에서는 코드 작성, 편집, 검색, 리팩토링, 디버깅 등 IDE내에서  수행하는 대부분의 작업 명령의 키보드 단축키(ShortCut)을 제공합니다. 자주 사용되는 단축키는 숙지해 두시면

ifuwanna.tistory.com

https://www.jetbrains.com

 

JetBrains: Essential tools for software developers and teams

JetBrains is a cutting-edge software vendor specializing in the creation of intelligent development tools, including IntelliJ IDEA – the leading Java IDE, and the Kotlin programming language.

www.jetbrains.com

 General

자주 사용되는 공통 부분 단축키 입니다.

 

⌘0~9(Alt+#[0-9]) : 각 단축키에 해당하는 도구창을 엽니다. 예를 들어 ⌘1 을 사용하면 프로젝트 도구창을 토글할 수 있습니다.

⌘⇧F12(Ctrl+Shift+F12) : 편집기(Editor) 영역을 최대로 크기로 토글합니다.( Toggle maximizing editor)

⌘,(Ctrl+Alt+S) : 설정(Preferences) 창을 엽니다. ( Open Settings dialog )

⌘;(Ctrl+Alt+Shift+S) : 프로젝트 구조를 확인 및 변경 할 수 있는 창을 엽니다. 해당 메뉴에서 Modules, Libraries, Facets, Artifacts, SDK,Project compiler output 등을 확인 및 변경 할 수 있습니다.(open Project Structure dialog

⌘E(Ctrl+E) : 최근 사용한 파일 목록을 조회합니다.(Recent files popup)

A(Ctrl+Shift+A) : 액션을 검색하여 실행합니다. 설정을 변경하거나 단축키 등이 생각나지 않을때 유용한 기능이며 전체 검색인 더블⇧ 로 대체 할 수 있습니다. (Find Action)

Double⇧ : 가장 자주 사용되는 단축키 입니다. 파일, 클래스, 설정 등 키워드에 관련된 가능한 모든 것을 검색해 보여줍니다.( Search everywhere )

 

 

Editing

편집기(Editor) 관련된 주요 단축키 입니다.

 

^Space(Ctrl+Space) : 기본 코드 자동완성 기능입니다.  (Basic code completion)

^⇧Space(Ctrl+Shift+Space) : 소스코드를 분석해서 적합한 자동완성 코드를 추천해줍니다. (Smart code completion)

⌘N,^(Alt+Insert) : 코드를 생성합니다. 생성자나 Getter/Setter, 메서드 오버라이드 등의 코드를 자동생성할때 유용합니다. (Generate Code)

⌘O(Ctrl+O) Override 가능한 메서드 목록을 확인하여 구현하기 위한 코드를 자동 생성해 줍니다.

⌘I(Ctrl+I)  Implement 가능한 메서드 목록을 확인하여 구현하기 위한 코드를 자동 생성해 줍니다.

 

⌘P(Ctrl+P) : 현재 위치한 메서드의 파라미터 정보를 조회합니다. (Parameter info -within method call arguments)

F1(Ctrl+Q) : 도큐멘트를 조회합니다.(Quick Documentation)

⌥Space(Ctrl+Shift+i) : 구현된 코드를 조회합니다. (Quick Definition)

⌘B(Ctrl+B) : 해당 코드의 선언부로 이동.

⌘⌥B(Ctrl+Alt+B) : 해당 코드의 구현부로 이동.

⌥F7(Alt+F7) : 해당 항목이 사용된 위치 검색 

F2 : 오류, 경고 영역으로 점프 

(Alt+⏎) : 퀵픽스 제안 (Show intention actions and quick-fixes)

 

⌘D(Ctrl+D) : 라인 복제 (Duplicate current line)

⌘⌫(Ctrl+Y) : 라인 삭제 (Delete line at caret)

⌥↑,⌥↓(Ctrl+W,Shift+Ctrl+W) : 커서 근처의 코드 선택 영역을 확대하거나 축소합니다.

←,⌥→(Ctrl+←,Ctrl+→) : 단어별 포커스 이동

←,⌥(Ctrl+Shift+←,Ctrl+Shift+→) : 단어별 선택

fn,fn(PageUp,PageDown): Page Up/Down

fn←,fn→(Home, End) : 라인 시작,끝으로 이동

fn←,fn(Shift+Home,Shift+End) : 라인 전체 선택

 

⌘/(Ctrl+/) : 라인단위로 주석처리 합니다. ( Comment / uncomment with line comment )

/(Ctrl+Shift+/) : 블럭단위로 주석처리 합니다. ( Comment / uncomment with block comment )

⌥⌘L(Ctrl+Alt+L) : 해당 프로젝트의 표준 서식에 맞도록 정렬합니다. (Reformat code)

 

Compile and Run

컴파일(Compile) 및 실행(Run) 관련 주요 단축키 입니다.

 

⌘F9(Ctrl + F9) : 프로젝트 빌드(Make project)

⌘R(Shift + F10) : 실행 (Run)  

⌘d(Shift + F9): 디버그 (Debug)

 

Refactoring

소스 리팩토링(Refactoring) 관련 단축키 입니다.

 

^T(Ctrl+Alt+Shift+T) : 리팩토링 관련 전체 항목을 조회합니다. (Refactor this)

F5 : 복사 (Copy)

F6 : 이동 (Move)

⇧F6(Shift+F6) : 이름 변경(Rename)

⌘F6(Ctrl+F6) : 접근제어자, 반환타입, 이름 등 주요 정보를 변경합니다. (Change Signature)

 

 

VCS / Local History

Git 같은 버전 관리 시스템(Version Control System) 관련 단축키 입니다.

 

K(Ctrl+K) : Commit project to VCS

K(Ctrl+Shift+K) : Push commits

T(Ctrl+T) : Update project from VCS

^V(Alt + BackQuote) :  ‘VCS’ quick popup

 

1. chartjs 데이터 label 외에 yAxisID를 추가해준다.

Y축 ID없이 그냥 position을 바꾸면1. chartjs 데이터 label 외에 yAxisID를 추가해준다.

아니면 dataset에서 설정해주던가..

 

Y축 ID없이 그냥 position을 바꾸면 값만 생기고 차트는 오른쪽값을 따라서 그려지게 된다.

 

 

2. options 의 scale에서 설정해준다.

[ options > scales > yAxes ]

position을 바꿔주면 된다.

 

참고코드 : embed.plnkr.co/dtb9tl/

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.bundle.min.js"></script>
  </head>

  <body>
    <h1>Hello Plunker!</h1>
    <div style="width:100%;">
      <canvas id="chart"></canvas>
    </div>
    <script src="script.js"></script>
  </body>

</html>
// Code goes here

var ctx = document.getElementById('chart').getContext('2d');
new Chart(ctx, {
  type: 'line',
  data: {
    labels: ['Visit 1', 'Visit 2', 'Visit 3', 'Visit 4', 'Visit 5'],
    datasets: [{
      label: 'LVEF % (Echo)',
      yAxisID: 'A',
      borderColor: '#ffbaa2',
      backgroundColor: 'white',
      data: [80, 70, 30, 20, 35],
      fill: false
    }, {
      label: 'Rhythm',
      yAxisID: 'B',
      borderColor: '#91cf96',
      backgroundColor: 'white',
      data: [80, 76, 79, 82, 80],
      fill: false
    }, {
      label: 'Height',
      yAxisID: 'C',
      borderColor: '#c881d2',
      backgroundColor: 'white',
      data: [185, 184, 183, 184, 185],
      fill: false
    }, {
      label: 'Weight',
      yAxisID: 'D',
      borderColor: '#29b6f6',
      backgroundColor: 'white',
      data: [65, 65, 65, 65, 65],
      fill: false
    }]
  },
  options: {
    tooltips: {
      mode: 'nearest'
    },
    scales: {
      yAxes: [{
        id: 'A',
        type: 'linear',
        position: 'left',
        ticks: {
          min: 0,
          max: 100,
          stepSize: 20,
          fontColor: '#ffbaa2',
          callback: function(value, index, values) {
            return value + ' %';
          }
        }
      }, {
        id: 'B',
        type: 'linear',
        position: 'right',
        ticks: {
          min: 60,
          max: 140,
          stepSize: 16,
          fontColor: '#91cf96',
          callback: function(value, index, values) {
            return value + ' bpm';
          }
        }
      }, {
        id: 'C',
        type: 'linear',
        position: 'right',
        ticks: {
          min: 160,
          max: 190,
          stepSize: 6,
          fontColor: '#c881d2',
          callback: function(value, index, values) {
            return value + ' cm';
          }
        }
      }, {
        id: 'D',
        type: 'linear',
        position: 'right',
        ticks: {
          min: 50,
          max: 100,
          stepSize: 10,
          fontColor: '#29b6f6',
          callback: function(value, index, values) {
            return value + ' kg';
          }
        },
        scaleLabel: {
          display: false
        },
      }]
    },
    elements: {
      line: {
        tension: 0, // disables bezier curves
      },
      point: {
        radius: 4,
        borderWidth: 2,
        pointStyle: 'circle'
      }
    }

  }
});

 

 

chartjs는 dataset 입력 순서대로 그려지고

가장 처음 그려진 것이 제일 위로 올라온다.

그리고 가장 처음 그려진 것의 범례 맨 앞에 위치함

 

범례는 그대로 내버려두고 차트의 순서만 바꾸고 싶다면

legend 옵션에서 reveser를 true로 바꿔주면된다.

 

 

dataset > order 옵션에서 순서를 정할 수 있다는데 안먹어서 찾아낸 방법.. 여러개인 경우는 모르겠다 ^ㅠ^

option에 responsive : false로 하면

캔버스크기에 맞춰서 그려짐 대충..

없으면 캔버스 크기 무시하고 지맘대로 그려버림.. 죽어..흑흑..

1시간은 날린듯

※ Data Type

- DATETIME : 'YYYY-MM-DD HH:MM:SS'

- DATE : 'YYYY-MM-DD'

- TIME : 'HH:MM:SS'

- CHAR : String

- SIGNED : Integer(64bit), 부호 사용 가능

- UNSIGNED : Integer(64bit), 부호 사용 불가

- BINARY : binary String

 

※ 숫자를 문자로 변환

SELECT CAST(1 AS CHAR(10)) AS testChar

 

※ 문자를 숫자로 변환

SELECT CAST('1' AS SINGNED) AS testInt



'DB > MYSQL' 카테고리의 다른 글

[MYSQL] date_format / left join on / if문 / 시간비교  (0) 2021.03.24
[MYSQL] 기본 - 계정생성 / 테이블생성 / 입력  (0) 2020.11.19
[MYSQL] 설치  (0) 2020.11.19

package java_sort;

 

import java.util.HashMap;

import java.util.Map;

 

public class HashmapGetdata {

 

    public static void main(String[] args) {

        

        Map<String, Object> hashMap = new HashMap();

 

 

        //데이터 넣어줌

        hashMap.put("num"1);

        hashMap.put("name""rios");

        hashMap.put("email""rios0812@naver.com");

        hashMap.put("phone_num""010-1234-1234");

 

 

        // ** value를 통해 key 값얻기 **       

        

        System.out.println(getKey(hashMap,"rios"));

        //rios라는 value 값을 통해서 얻은 key 값 -> name

        System.out.println(getKey(hashMap,"rios0812@naver.com"));

        //rios0812@naver.com 라는 value 값을 통해서 얻은 key 값 -> email

 

 

        // ** key를 통해 value얻기 **

 

        String getName = (String) hashMap.get("name");

        System.out.println(getName);

        //name 이란 key값을 통해서 value 값은 -> rios 

 

        String getPhone = (String) hashMap.get("phone_num");

        System.out.println(getPhone);

        //phone_num 이란 key값을 통해서 value 값은 -> 010-1234-1234

    }

 

 

   // hashmap에 value 로 key 찾기

   public static <K, V> K getKey(Map<K, V> map, V value) {

 

        for (K key : map.keySet()) {

            if (value.equals(map.get(key))) {

                return key;

            }

        }

        return null;

    }

 

devjhs.tistory.com/89

 

[mysql] DATE_FORMAT - 날짜 형식 설정

1. DATE_FORMAT - 역할 DATE_FORMAT(날짜 , 형식) : 날짜를 지정한 형식으로 출력 2. DATE_FORMAT - 구분기호  구분기호 역할 구분기호 역할  %Y 4자리 년도 %m 숫자 월 ( 두자리 )  %y 2자리 년도 %c 숫자..

devjhs.tistory.com

blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where

 

[SQL] join의 on절과 where절 차이

이전 블로그에서 옮겨온 포스트

blog.leocat.kr

.m.blog.naver.com/PostView.nhn?blogId=rorean&logNo=221594169204&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[mysql] IF 문 사용하기

​​IF 사용법은 엑셀에서 IF 함수 사용하는 것과 동일하다. 엑셀이 친숙하다면 어렵지 않게 사용 가능...

blog.naver.com

 

banasun.tistory.com/entry/mysql-%ED%98%84%EC%9E%AC%EB%A1%9C%EB%B6%80%ED%84%B0-6%EC%8B%9C%EA%B0%84-%EC%9D%B4%EB%82%B4%EC%9D%98-record%EB%A5%BC-select-%ED%95%98%EA%B8%B0

 

[mysql] 현재로부터 6시간 이내의 record를 select 하기

오늘은 SQL query문 중 기초적인 부분에 대해서 써볼까 합니다. 물론 오늘 한 작업 중 한 가지 소스이지요 ㅋㅋ DATETIME 필드를 기준으로 현재로부터 6시간 이내에 발생한 record를 불러오는 겁니다. MY

banasun.tistory.com

 

'DB > MYSQL' 카테고리의 다른 글

[MYSQL] CAST (형변환)  (0) 2021.03.30
[MYSQL] 기본 - 계정생성 / 테이블생성 / 입력  (0) 2020.11.19
[MYSQL] 설치  (0) 2020.11.19

구글링 해보니까 이게 제일 비슷한 것 같아서 이걸로 퍼옴

 

생성과정(start) / 갱신과정(props changed & state changed) / 소멸과정 (componentWillUnmount)

shouldComponentUpdate 함수의 반환값(true/false)에 따라 갱신과정은 생략되기도 한다. (갱신과정생략)

 

 

 

생성 과정의 생명주기 함수들 실행해보기

 

1. constructor(props)함수

맨 처음에 생성될 때 한번만 호출되며 상태(state)를 선언할 떄 사용된다.

항상 super()함수를 가장 위에 호출해야 한다.

=> super() 함수에는 프로퍼티와 생명 주기 상태등을 초기화하는 과정을 포함하고 있기 때문.

 

2. render()함수

데이터가 변경되어 새 화면을 그려야 할 때 자동으로 호출되는 함수

render()가 반환하는 JSX를 화면에 그려준다.

 

3. static getDerivedStateFromProps(props, state)함수 (이름왜케길어)

정적 함수로, 함수안에서 this.props나 this.state와 같은 방법으로 값에 접근이 불가하다.

만약 값에 접근하려면 인자로 전달된 props, state를 이용해야 하는데,

이때 props는 상위 컴포넌트에서 전달된 값이며, state는 현재 컴포넌트의 state값이다.

> 이 함수는 상위 컴포넌트에서 전달받은 프로퍼티로 state값을 연동할 때 주로 사용하며,

   반환 값으로 state를 변경한다.

 

4. componentDidMount()함수

render함수가 JSX를 화면에 그린 이후 호출되는 함수

=> 컴포넌트가 화면에 모두 표횬된 이후에 해야 하는 작업들은 여기서하면 된다.

 

 

 

 

[그림에서는 START부분]

import React from "react";

class LifecycleExample extends React.Component {
  static getDerivedStateFromProps() {
    console.log("getDerivedStateFromProps 호출");
    return {};
  }

  constructor(props) {
    super(props);
    //getDerivedStateFromProps()함수를 사용하므로
    //경고메세지를 건너뛰기 위해 state 초기값 설정

    this.state = {};
    console.log("constructor 호출");
  }

  componentDidMount() {
    console.log("ComponentDidMount 호출");
  }

  componentDidUpdate() {
    console.log("ComponentDidUpdate 호출");
  }

  componentWillUnmount() {
    console.log("ComponentWillUnmount 호출");
    return {};
  }

  getSnapshotBeforeUpdate() {
    console.log("getSnapshotBeforeUpdate 호출");
    return {};
  }

  shouldComponentUpdate() {
    console.log("shouldComponentUpdate 호출");
    return true;
  }

  render() {
    console.log("render 호출");
    return null;
  }
}

export default LifecycleExample;

 

 

변경 과정의 생명주기 함수들 실행해보기

상위 컴포넌트의 프로퍼티나 state의 변화가 생기면 실행된다.

 

1. shouldComponentUpdate(nextProps, nextState)

프로퍼티를 변경하거나, setState()함수를 호출하여 state값을 변경하면 '화면을 새로 출력해야하는지' 판단하는 함수

** 이 함수는 화면을 새로 출력할지 말지 판단하며, 데이터 변화를 비교하는 작업을 포함하므로 리액트 성능에 영향을 많이 준다.

forceUpdate()함수를 호출하여 강제로 화면을 출력하면 이함수는 호출되지 않는다.

 

2. getSnapshotBeforeUpdate(prevProps, prevState)

컴포넌트의 변경된 내용이 가상화면에 완성된 이후에 호출되는 함수

컴포넌트가 화면에 실제로 출력되기 전에 호출되므로 화면에 출력될 엘리먼트의 크기, 또는 스크롤 위치등의 DOM정보에 접근할 때 사용된다.

 

3. componentDidUpdate(prevProps, PrevState, snapshot)함수

실제 화면에 출력된 이후 호출되는 함수

부모 컴포넌트로부터 전달된 이전 프로퍼티(prevProps)와 이전 state값(prevState)과 함께, getSnapshotBeforeUpdate() 함수에서 반환된 값(snapshot)을 인자로 전달 받는다.

이 값들을 이용하여 스크롤의 위치를 옮기거나 커서를 옮기는 등의 DOM정보를 변경할 때 사용된다.

 

 

  componentDidMount() {
    console.log("ComponentDidMount 호출");
    // state값을 변경
    this.setState({updated : true});
  }

 

shouldComponentUpdate() 반환값을 false로 하면

-> 리액트 엔진은 데이터 비교 후 변경 사항이 없다고 판단하므로, 변경과정의 생명주기 함수가 실행되지 않는다.

  shouldComponentUpdate() {
    console.log("shouldComponentUpdate 호출");
    // false로 변경
    return false;
  }

결과값과 상관없이 화면 동기화를 진행하고 싶다면 forceUpdate()함수를 사용해야 한다.

  componentDidMount() {
    console.log("ComponentDidMount 호출");
    this.forceUpdate();
  }

 

소멸 과정의 생명주기 함수들 실행해보기

컴포넌트가 화면에서 생략되면 시작

 

componentWillUnmount()

컴포넌트가 소멸되기 직전에 호출되는 함수

보통 컴포넌트에서 감시하고 있는 작업들을 해제할 때 필요한 함수이다 (뭔말이지?)

예를 들어 컴포넌트에 setInterval()함수가 사용되었다면 이 함수에서 setInterval()함수를 clearInterval()함수로 해제해야 한다. (그렇군..)

이러한 해제 작업이 생략되면 메모리 누수현상이 발생하여 브라우저가 멈추기도 하기 때문이다.

 

 

 

App 컴포넌트에서 LifecycleExample 컴포넌트를 그리지 않도록(null) 코드를 작성

/// app.jsx


import React from "react";
import LifecycleExample from "./03/LifecycleExample";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hadDestroyed: false };
  }
  componentDidMount() {
    this.setState({ hadDestroyed: true });
  }

  render() {
    return (
      <div>
        <div>{this.state.hadDestroyed ? null : <LifecycleExample />}</div>
      </div>
    );
  }
}

export default App;

 

 

카운터 프로그램을 만들며 생명주기 함수 사용해보기

 

 

counter.jsx

: state의 초기값을 설정할 때 props.count와 같이 프로퍼티로 받은 값을 사용한다.

import React, { Component } from "react";

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      // count 초기값을 프로퍼티에서 전달된 값으로 설정한다.
      count: props.count,
    };
    this.increaseCount = this.increaseCount.bind(this);
  }
  increaseCount() {
    this.setState(({ count }) => ({
      count: count + 1,
    }));
  }
  render() {
    return (
      <div>
        현재카운트 : {this.state.count}
        <button onClick={this.increaseCount}>카운트증가</button>
      </div>
    );
  }
}

export default Counter;

NewCount.jsx

gerDerfivedStateFromProps() 함수를 사용하여 변경된 프로퍼티 값으로 state값을 갱신한다.

app컴포넌트가 전달한 최초의 프로퍼티 값은 state.count에 저장되며,

NewCounter 컴포넌트는 state.newCount로 증가값을 따로 분리하여 관리

=> state.count가 아니라 state.newCount로 증가값을  관리하는 이유는,

getDerivedStateFromProps()함수는 다른 프로퍼티가 변경되어도 호출되기 때문이다.

import React, { Component } from "react";

class NewCounter extends Component {
  constructor(props) {
    super(props);
    this.state = {};
    this.increaseCount = this.increaseCount.bind(this);
  }

  static getDerivedStateFromProps(props, state) {
    const { count } = props;
    return {
      //프로퍼티에서 전달된 count값을 보관한다
      count,
      newCount:
        count === state.count
          ? //프로퍼티가 변경되지 않았다면 기존state값으로 설정
            state.newCount
          : //변경되었다면 변경된 값으로 설정
            count,
    };
  }

  increaseCount() {
    this.setState(({ newCount }) => ({
      newCount: newCount + 1,
    }));
  }
  render() {
    return (
      <div>
        현재카운트 : {this.state.newCount}
        <button onClick={this.increaseCount}>카운트증가</button>
      </div>
    );
  }
}

export default NewCounter;

 

 

import React from "react";
import Counter from "./03/Counter";
import NewCount from "./03/NewCounter";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 10 };
    this.resetCount = this.resetCount.bind(this);
  }

  resetCount() {
    this.setState(({ count }) => ({ count: count + 10 }));
  }

  render() {
    return (
      <div>
        <div>
          <Counter count={this.state.count} />
        </div>
        <div>
          <NewCount count={this.state.count} />
        </div>
        <button onClick={this.resetCount}>
          {this.state.count + 10}으로 초기화
        </button>
      </div>
    );
  }
}

export default App;

 

 

NewCounter 컴포넌트만 gerDerivedStateFromProps()함수로 App 컴포넌트부터 갱신된 프로퍼티 값을 동기화 했기 때문에 초기화버튼은 NewCounter에만 적용된다.

Counter 컴포넌트는 처음 생성될때만 프로퍼티 값을 설정하므로 갱신 과정에서는 변경X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts