react에서 naver지도를 연결 해줘야 하는 상황이 있어 찾아 보니 

 

https://github.com/zeakd/react-naver-maps

 

GitHub - zeakd/react-naver-maps: Controlled React Component for Naver Maps to handle zoom, center, etc.

Controlled React Component for Naver Maps to handle zoom, center, etc. - GitHub - zeakd/react-naver-maps: Controlled React Component for Naver Maps to handle zoom, center, etc.

github.com

https://zeakd.github.io/react-naver-maps/

 

React Naver Maps Style Guide

 

zeakd.github.io

이런 감사한 분이 있습니다. 가이드도 친절하고 react에 맞게 작업하기 편하게 만들어 주셨습니다.

간단한 사용방법 정리 했습니다.

 

모듈 설치를 해야 하니 해당 프로젝트 폴더에서

yarn add react-naver-maps 명령어를 실행 시킵니다.

그리고 사용할 페이지에서 2개의 패키지를 import합니다.

import { NaverMap, Marker } from 'react-naver-maps';
import { RenderAfterNavermapsLoaded } from 'react-naver-maps';

 

NaverMap -> 지도호출

Marker  -> 마커표시

RenderAfterNavermapsLoaded  -> 지도 비동기 호출을 위해

지도를 표현만 한다면 위의 3개만 있으면 됩니다. 자세한 내용은 가이드 사이트 보시면 잘 설명 되어 있습니다.

import { NaverMap, Marker } from 'react-naver-maps';
import { RenderAfterNavermapsLoaded } from 'react-naver-maps'; 

const NaverMapView =({mapLat, mapLng})=> {
    return (
        <>
            <RenderAfterNavermapsLoaded	   // render 후 지도 호출(비동기 랜더링)
                ncpClientId={'Client ID'} // 지도서비스 Client ID
                error={<p>error</p>}
                loading={<p>Maps Loading</p>}
                submodules={["geocoder"]} //추가로 사용할 서브모듈이 있는경우
            >
                <NaverMap
                    id="react-naver-maps"
                    style={{ width: '100%', height: '100vh' }}
                    center={{ lat: mapLat, lng: mapLng }}
                >
                    <Marker position={{ lat: mapLat, lng: mapLng }}/>
                </NaverMap>
            </RenderAfterNavermapsLoaded>
        </>
    )
}

export default NaverMapView;

해당 내용을 NaverMapView.js 로 생성하고 노출을 원하는 페이지에서 해당 페이지를 추가 해주시면 됩니다.

import NaverMapView from "../inc/NaverMapView";

const Map =()=>{ 
	let mapLat = "37.3595704";
	let mapLng = "127.105399";
    return(
        <div className="row mt-1" style={{height: "300px;"}}>
            <NaverApiMap mapLat={mapLat} mapLng={mapLng}></NaverApiMap>				
        </div>       
    );    
}
    
export default Map;

상황에 따라서 지도의 위치 및 마커를 변경 하고 싶은 경우 useState 를 사용해서 lat, lng를 정의 해줘야 합니다.

아래와 같이 선언 해주고

const [{ mapLat, mapLng }, setGeometricData] = useState({
  mapLat: 37.486708581137,
  mapLng: 127.037893303934,
});

해당 값을 상황에 맞게 변경 해주는 겁니다. 가장 사용 하지 않을거 같은 2가지 상황을 기준으로 작업 해본다면

(아래 2가지 경우 모두 https 에서만 허용되니 https에서 테스트 해주셔야 합니다.)

1. 내 위치 기준으로 지도,마커 변경

function getLocation() {
	if(navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(
			function (position){
				setGeometricData({mapLat:position.coords.latitude, mapLng:position.coords.longitude});
			}, 
			function (error){
				console.error(error);
			}, 
			{
				enableHighAccuracy: false,
				maximumAge: 0,
				timeout: Infinity
		});
	}else{
		alert('gps관련 정보가 없습니다.');
	}
}

함수를 이용 할 수 있습니다.

2. 주소 기준으로 지도,마커 이동

이 경우 geocoder 서브모듈을 사용해야 하는데 위의 네이버지도 호출 시 submodules={["geocoder"]} 라는 부분이 추가 되어 있는걸 확인 할 수 있습니다. 원하는 서브모듈이 있는경우 위와 같이 추가 해주시면 됩니다.(여러개의 경우 배열로 넣어 주시면 됩니다. 깃허브 이슈 내용에 보면 아래와 같이 기술 되어 있습니다.)

const mySubModule = ['panorama','geocoder'];

<RenderAfterNavermapsLoaded>
    ncpClientId={ClientID}
    submodules={mySubModules}

</RenderAfterNavermapsLoaded>

주소를 기준으로 좌표를 가지고 오는 함수를 아래와 같이 추가 해주고

const searchAddressToCoordinate =(address)=> {
	const navermaps = window.naver.maps;

	navermaps.Service.geocode(
		{
			query: address,
		},
		function (status, response) {
			if (status === navermaps.Service.Status.ERROR) {
				if (!address) {
					return alert('Geocode Error, Please check address');
				}
				return alert('Geocode Error, address:' + address);
			}

			if (response.v2.meta.totalCount === 0) {
				return alert('No result.');
			}

			let item = response.v2.addresses[0];
			console.log(item.x+" : "+item.y);
			setGeometricData({mapLat:item.x, mapLng:item.y});
		},
	);
}

호출 해주시면 됩니다. 가이드 문서에 이밖에 어떻게 하면 naver map을 react에서 편하게 사용 할 수 있는지

나와 있으니 참고 해보면 좋을거 같습니다.

반응형

'javascript > react' 카테고리의 다른 글

react 에서 fontawesome 사용하기  (0) 2022.03.17
react yarn 빌드하기  (0) 2022.03.15
react 에서 bootstrap 사용하기  (0) 2022.03.08
window react 개발 환경 설정  (0) 2021.06.21
Posted by 질주하는구
,

react 작업시 기존에 사용하던 fontawesome 를 사용하기 위해 작업을 진행 하면서 정리한 내용 입니다.

공식 홈페이지에 워낙에 잘 정리가 되어 있어 적을 필요가 없을거 같긴 한데...

만약 검색을 하다 이 페이지 오신 분이라면 아래 링크를 타고 들어가시면 잘 정리된 내용을 

확인 할 수 있습니다.

https://fontawesome.com/docs/web/use-with/react/

 

Set Up with React

Font Awesome 6 brings loads of new icons and features to the most popular icon set in the world.

fontawesome.com

우선 fontawesome 관련 모듈을 추가 해줍니다. 전 yarn으로 작업 하기 때문에 아래의 add명령을 실행 해줍니다.

add명령은 작업 하려는 프로젝트 폴더에서 진행 해주시면 됩니다.

 

yarn add @fortawesome/fontawesome-svg-core
yarn add @fortawesome/free-solid-svg-icons
yarn add @fortawesome/free-regular-svg-icons
yarn add @fortawesome/react-fontawesome@latest

fontawesome-svg-core 예전에는 <i 태그로 아이콘을 사용했지만 현재는 svg태그로 아이콘을 사용 한다고 합니다.

(웹은 기술 뿐만 아니라 규약, 라이브러리 모든것이 너무 빨리 변해서 따라 가는게 힘이 듭니다. 전자정부 같은 SI만 하다보면 개인 프로젝트 하면서 따라 간다는게 쉬운일이 아니네요)

free-solid-svg-icons, free-regular-svg-icons 아이콘 페키지 입니다. solid와 regular 2개의 패키지를 추가 했습니다.

(거의 solid만 사용하긴 하는데 하는김에 regular도 가끔 사용하니 추가 해줍니다.)

react-fontawesome@latest react와 fontawesome를 연결 해주는 패키지를 추가 해줍니다. 추가시 버전은 latest(최신)

입니다.

 

패키지를 설치 하고 나서는 아래의 내용을 보고 사용하려는 페이지에 아이콘을 추가 해주시면 됩니다.

https://fontawesome.com/docs/web/use-with/react/add-icons

 

Add Icons with React

Font Awesome 6 brings loads of new icons and features to the most popular icon set in the world.

fontawesome.com

전 단건으로 추가해도 상관 없으니

import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCrosshairs } from '@fortawesome/free-solid-svg-icons'

 

<FontAwesomeIcon icon={faCrosshairs} />

형식으로 추가 했지만 여러곳에서 많은 아이콘을 사용한다면 설명중 Dynamic Icon Importing 방식이 작업이 

편할거 같습니다.

(Dynamic Icon Importing 을 하려고 했는데... babel.config.js, babel-plugin-macros.config.js 관련 설정을 하지 못해 잠시 미뤄둔 상태 입니다. 작업 하는데로 내용 갱신 진행 하겠습니다.)

반응형

'javascript > react' 카테고리의 다른 글

react naver map 연동  (0) 2022.03.17
react yarn 빌드하기  (0) 2022.03.15
react 에서 bootstrap 사용하기  (0) 2022.03.08
window react 개발 환경 설정  (0) 2021.06.21
Posted by 질주하는구
,

작업한 react프로젝트를 배포하기 위해 build를 해야 하는 경우 yarn을 이용해 간단하게 작업 할 수 있습니다.

 

cmd창에서 작업한 폴더로 이동 후

yarn build

명령을 입력 하시면 

와 같은 화면이 출력 되고 해당 폴더 하위에 build폴더가 생성되고 압축파일들이 생기는걸 볼 수 있습니다.

build시 나오는 문구중 package.json 파일에 homepage 설정을 통해서 빌드할 경로를 관리 할 수 있다고 나오는데

자신이 작업하는 react프로젝트 package.json파일에

와 같이 "homepage" : "빌드경로" 를 지정 해주실수도 있습니다.

반응형

'javascript > react' 카테고리의 다른 글

react naver map 연동  (0) 2022.03.17
react 에서 fontawesome 사용하기  (0) 2022.03.17
react 에서 bootstrap 사용하기  (0) 2022.03.08
window react 개발 환경 설정  (0) 2021.06.21
Posted by 질주하는구
,

react에서 bootstrap을 사용하기 위해 우선 bootstrap 패키지를 설치 해줘야 합니다.

-npm을 사용하는 경우 아래와 같이
npm install react-bootstrap bootstrap
-yarn을 사용하는 경우 아래와 같이
yarn add react-bootstrap bootstrap

command창에서 입력 해주시면 자동으로 bootstrap패키지라 추가 됩니다.
그뒤 컴퍼넌트 호출을 위해 app.js파일에 bootstrap관련 내용을 import해줍니다.

import 'bootstrap/dist/css/bootstrap.min.css';
import * as ReactBootstrap from "react-bootstrap";

 

bootstrap.min.css import부분은 index.html에서 CDN방식으로 link태그를 추가 할 수 도 있습니다.

https://react-bootstrap.github.io/

 

React-Bootstrap

The most popular front-end framework, rebuilt for React.

react-bootstrap.github.io

import css를 하게 되면 nodemodule 하위에 설치한 bootstrap 파일이 빌드시 같이 빌드 됩니다.

index.html을 수정한 경우 실행 시 마다 최신 정보를 요청하고 적용 합니다.


import * as ReactBootstrap 이 부분의 경우 컴포넌트를 동적으로 호출 하기 위한 설정으로

<ReactBootstrap.Button>Boot strap</ReactBootstrap.Button> 와 같이 사용 하시면 됩니다.
이 밖에 단건으로 

import { COMPONENT_NAME } from 'react-bootstrap';
이렇게 호출 도 가능 하고 
import React, { Component } from "react";
import { Form, Col, Button } from "react-bootstrap";
그룹으로 묶어서 추가도 가능 합니다.

자세한 내용은 아래의 url에서 확인 가능 합니다.

 

https://www.pluralsight.com/guides/how-to-import-components-from-react-bootstrap

 

How to Import Components from React Bootstrap | Pluralsight

In this guide, you have learned the various methods for importing components, like importing single components, individual components, dynamic components, and multiple components using a single import statement.

www.pluralsight.com

 

반응형

'javascript > react' 카테고리의 다른 글

react naver map 연동  (0) 2022.03.17
react 에서 fontawesome 사용하기  (0) 2022.03.17
react yarn 빌드하기  (0) 2022.03.15
window react 개발 환경 설정  (0) 2021.06.21
Posted by 질주하는구
,

${searchText} -> {{html searchText}} 같이 변경 해주면 됩니다.

 

https://stackoverflow.com/questions/5618868/jquery-tmpl-how-do-i-render-html?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa 

 

jQuery tmpl: How do I render Html?

Okay, I'm in a sitiuation with jQuery, the tmpl-plugin and this: ${$value.Text} This is okay and works fine but as I just found out via the documentation: Using {{html fieldNameOrExpression}} ...

stackoverflow.com

 

반응형
Posted by 질주하는구
,

jqgrid 옵션

javascript 2022. 2. 18. 12:12

jqgrid사용시 활용 할 수 있는 옵션 및 기본 사용법 정리한 블로그

 

https://aljjabaegi.tistory.com/322

 

jquery jqgrid 의 모든 것, 사용법, jQuery 추천 그리드

추천 그리드 ▼ Link : https://aljjabaegi.tistory.com/593 [VanilaJS Free Grid library] Aljjabaegi Grid Grand Open [Free Grid library] Aljjabaegi Grid Grand Open 여러 무료 라이브러리를 사용해오..

aljjabaegi.tistory.com

https://sseoui.tistory.com/107

 

jqgrid 자주 사용되는 태그

출처 aljjabaegi.tistory.com/322 jquery jqgrid 의 모든 것, 사용법, jQuery 추천 그리드 jquery jqgrid 의 모든 것, 사용법, jQuery 추천 그리드 jqgrid는 개발하기 편하고 빠르며 다양한 옵션을 제공하여 선호..

sseoui.tistory.com

 

반응형
Posted by 질주하는구
,

기간을 지정해야 하는 화면에서 달력2개를 사용하지 않고 하나의 달력으로 처리 하는경우 (날짜 관련 검증)이
자동으로 처리 되기 때문에 소스를 조금이라도 줄일 수 있습니다.
그래서 bootstrap4에서 사용하는 daterangepicker의 간단 사용방법을 작성 합니다.

우선 관련 js파일을 추가 해줍니다.

<script src="/plugins/moment/moment.min.js"></script>
<script src="/plugins/daterangepicker/daterangepicker.js"></script>

사용 방법은 아주 간단 합니다.

<input type="hidden" name="bannerDataSdate" id="bannerDataSdate" value="">
<input type="hidden" name="bannerDataEdate" id="bannerDataEdate" value="">
기간을 가지는 데이터를 hidden으로 처리 하고 실제 화면에 달력이 나오는 태그는 아래와 같이 추가 합니다.

<input type="text" class="form-control datetimepicker-input" name="tempDate" id="tempDate" placeholder="출력기간" title="출력기간" readonly>
<div class="input-group-append">
<div class="input-group-text"><i class="fa fa-calendar tempDateBtn"></i></div>
</div>

https://www.daterangepicker.com/#examples url을 참고 해서 기본 스크립트를 작성 해줍니다.

$('input[name="tempDate"]').daterangepicker({ 
    locale: {
      format: 'YYYY-MM-DD'
   }
});
2021-08-18 날짜를 이렇게 표현 해주기 위해 format 관련 부분만 지정 해줍니다.
그외 만은 옵션이 있는데 그건 예제를 보고 작업 해주면 됩니다. 예제 페이지 하단에  보면 자신이 원하는 옵션을 선택하면 관련 script를 만들어
주기 때문에  사용이  편합니다.


호출하게 되면 화면은 아래와 같이 출력 됩니다.


apply 버튼을 선택 하면 시작일, 종료일 정보를 hidden에 셋팅 해주기 위해 아래의 스크립트를 추가 해줍니다.

$('input[name="tempDate"]').on('apply.daterangepicker', function(ev, picker) {
   $("#bannerDataSdate").val(picker.startDate.format('YYYY-MM-DD'));
   $("#bannerDataEdate").val(picker.endDate.format('YYYY-MM-DD'));
});
그리고 tempDateBtn 버튼을 눌렀을때 날짜 선택 화면이 나올 수 있게 아래의 코드도 추가 해줍니다.
$('.tempDateBtn').click(function(event){
   event.preventDefault();
   $('input[name="tempDate"]').data('daterangepicker').show();
});
(event.preventDefault(); 이 부분은 element의 기본 이벤트 동작을 중지 시켜주는 코드 입니다. 관련 코드로 stopPropagation 이 있는데
이건 이벤트가 부모 element에게  전달 되는걸 막아주는 코드 입니다.)

상세화면 구성을 위해서 데이터를 가지고 와서 아래와 같이 셋팅 해주면 됩니다.

$('#tempDate').data('daterangepicker').setStartDate(jsonData.bannerData.bannerDataSdate); 
$('#tempDate').data('daterangepicker').setEndDate(jsonData.bannerData.bannerDataEdate);

기본 적인 사용 방법을 정리 합니다. 
옵션을 활용하면 좀더 정교한 사용이 가능 한데 사용자 화면은 앞으로 vue.js로 작업 할 생각 이어서 추가  옵션을 사용하게 될지는
모르겠습니다.

반응형
Posted by 질주하는구
,

scritp 이용한 입력제한 작업을 할때 class명 기준으로 작업 내용 정리

 

-- 숫자만 입력(class="numOnly")

$("document").ready(function() {
   $(".numOnly").on('keyup',function(event){
      if (!(event.keyCode >=37 && event.keyCode<=40)) {
         var inputVal = $(this).val();
         $(this).val(inputVal.replace(/[^0-9]/gi,''));
      }
   });
   $(".numOnly").css('imeMode', 'disabled');
});

반응형
Posted by 질주하는구
,

1. 기본 호출

 

let fields = [
   { name: "Name", type: "text", title:"Name", width: 150 },
   { name: "Age", type: "number", title:"Age", width: 50 },
   { name: "Address", type: "text", title:"Address", width: 200 },
   { name: "Country", type: "select", title:"Country"},
   { name: "Married", type: "checkbox", title: "Is Married", sorting: false }
]

$("#jsGrid").jsGrid({
   locale:"ko",
   height: "auto",
   width: "500px",
   editing: false,
   sorting: true,
   paging: false,
   autoload: true,
   fields: fields,
   controller: {
       loadData: function(filter) {
       var d = $.Deferred();
      $.ajax({
         url: "http://........",
         dataType: "json"
      }).done(function(response) {
         //조회 데이터 셋팅
         d.resolve(response.aaData);//<-aaData key에 json데이터 설정해서 넘긴 경우
      });
      return d.promise();
   }
}
});

2. 페이지 처리를 할 경우 controller 부분

controller: {
   loadData: function(filter) {
   var d = $.Deferred();
   //데이터 조회 시 pateSize,pateIndex 을 이용해서 조회할 페이지 정보를 검색 합니다.
   $.ajax({
      url: controllerUrl,
      dataType: "json",
      data:{
         "row":filter.pateSize,//페이지 row
         "page":filter.pateIndex//페이지 번호
      }
   }).done(function(response) {
      //페이징 처리를 위해 data, itemsCount 값을 같이 넘겨 줘야 합니다.
      d.resolve({data: response.aaData, itemsCount: response.total});
   });
      return d.promise();
   }
}
});

3. 행을 마우스로 이동 하기 원하는 경우

$("#jsGrid").jsGrid({
   rowClass: function(item, itemIndex) {
      //행별로 id값을 지정
      return "client-" + itemIndex;
   }
   $gridData.sortable();
});

4. 컬럼 노출 방식을 다르게 하는 경우

function itemTemplateType1(value, item){
   if(value=="Y"){
      return "사용";
   }else if(value=="N"){
      return "미사용";
   }else{
      return "-";
   }
}

{ name: "item1", type: "text", width: "10%", title:"사용여부", align: "center", itemTemplate:itemTemplateType1}

5. 해당 항목이 편집 기능이 필요한 경우

{ name: "item1", type: "select", title:"사용여부", width: "20%", editing: true, type: "select", items: [{id:"Y",name:"사용"},{id:"N",name:"미사용"}], valueField: "id", textField: "name"}

6. 편집기능 사용시 자동 활성화 되는 행클릭 이벤트(행 선택 시 편집모드 활성화) 예외처리
rowClick: function(args){
   if(args.item.Editable){
      jsGrid.Grid.prototype.rowClick.call(this, args);
   }
   //편집 버튼 비 활성화 후 상세보기 등의 추가 작업이 필요한 경우 아래에 작성
   var getData  = args.item;
}

7. 행 추가 작업이 필요한 경우(insertItem 옵션 이용)

var insert_item = {};
insert_item.item1 = "Y";
$("#jsGrid").jsGrid("insertItem", insert_item);

 

8. jsGrid 목록에 관리 버튼을 추가 하고 해당 버튼 선택 시 rowClick이벤트 발생에서 다른 작업을 하고자 하는 경우

아래의 itemTemplate를 이용해서 버튼을 추가 해주고(이때 버튼에 특정 class명을 주입 합니다.)
itemTemplate: function(value) {
   return "<button type=\"button\" class=\"btn btn-default btn-sm visualDataSetBtn\" title=\"관리\"><i class=\"fas fa-cog\"></i></button>";
}

rowClick 이벤트 발생 부분에 이벤트 객체의 class명으로 특정 클래스가 존재 하는 경우 분기를 추가

rowClick: function(args){
    let $target  = $(args.event.target);
   if($target.closest(".visualDataSetBtn").length) {
      //버튼 클릭 이벤트
   }else{
      //그외 이벤트
   }
}

버튼 클릭 기본 이벤트 발생되지 않게 return false처리
$(".visualDataSetBtn").click(function () {
   return false;
});

반응형
Posted by 질주하는구
,

npm run dev 실행 시 에러가 발생되는 경우 해당 프로젝트에서 npm install 실행 후 run dev를 실행 해줘야 합니다.

1. cmd창 실행
2. cd 프로젝트폴더명
3. npm install (명령어 실행)

3번까지 작업시 해당 프로젝트 폴더 하위에 node_modules 폴더가 생성되고 모든 모듈이 설치 되게 됩니다.
이렇게 되면 프로젝트 별로 모듈을 install해줘야 하는데 옵션중 -g(global) 옵션을 이용해서

npm install -g 이렇게 설치도 가능 합니다. 
이 경우 설치 경로는 'C:\Users\사용자명\AppData\Roaming\npm\node_modules' 하위로 설치 되게 됩니다.

그 후 npm run dev 실행 시 해당 모듈을 찾을수 없다는 에러가 발생되게 됩니다.
'Couldn't find preset “env” relative to directory' 이런식으로 발생 됩니다. 

이 경우 프로젝트 폴더 하위에 node_modules 폴더 및 하위에 관련 모듈이 없기 때문에 발생되는 문제로
프로젝트 폴더 위치에서 'npm link babel-preset-env' 명령어를 실행하게 되면 node_modules 하위에 링크폴더가 생성되어 글로벌 모듈
폴더를 참조 할 수 있게 됩니다.
(webpack.config.js 파일을 수정해서 처리도 가능 할거 같습니다.)

추가로 run 명령어 실핼시 'Cannot find module 'webpack-cli/bin/config-yargs'' 같은 메시지가 출력되고 버전이 맞지 않는다는 메시지가 나오는경우
cli로 생성된 프로젝트 하위의 'package.json' 파일의 열어

"devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "css-loader": "^0.28.7",
    "file-loader": "^1.1.4",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }

각 모듈의 버전 정보를 확인해서 
'npm install -g webpack@3.6.0' 과 같이 버전을 명시해서 install 해주시면 됩니다.
기존에  설치된 모듈은 
'npm uninstall -g webpack' 명령어로 삭제 후 설치 해주시면 됩니다.


-- npm install -g webpack (글로벌 위치에 webpack모듈 설치)
-- npm uninstall -g webpack (글로벌 위치의 webpack모듈 삭제)
-- npm install -g webpack@3.6.0(글로벌 위치에 3.6.0버전 webpack 모듈 설치)
-- npm link webpack(현재 프로제트 node_modules 폴더에 글로벌 참조하는 링크 폴더 생성)

반응형

'javascript > vue.js' 카테고리의 다른 글

vue.js vs-code 설정  (0) 2021.07.07
Posted by 질주하는구
,