배열에 includes 통하여 조건 단순화

function isKoreanFood(food) {
  if (["불고기", "비빔밥", "떡볶이"].includes(food)) {
    return true;
  }
  return false;
}

const food1 = isKoreanFood("불고기");
const food2 = isKoreanFood("파스타");
console.log(food1);
console.log(food2);

객체의 가로 표기법으로 if 문 줄이기

const meal = {
  한식: "불고기",
  중식: "멘보샤",
  일식: "초밥",
  양식: "스테이크",
  인도식: "카레"
};

const getMeal = (mealType) => {
  return meal[mealType] || "굶기";
};

console.log(getMeal("중식"));
console.log(getMeal());

 

flexbox 는 중요한 3가지 개념이 있다.

  1. Container와 Item 에 대한 속성
  2. 중심축과 반대축에 이해 
  3. justify-content, align-content  에 대한 속성

1. Container 와 Item 에 대한 속성 이해 

flex 구조

flex는 container와 item으로 구분되며 각각 지정할 수 있는 속성이 정해져 있다. 

Container 속성 (flex 요소들을 감싸는 태그)

display flex
flex-wrap nowrap(한줄로 표현), wrap 
flex-direction 중심축 지정 : row(기본값, 수평), column(수직)  
flex-flow column nowrap 으로 지정가능
justify-content 중심축 아이템 배치
align-items 반대축 아이템 배치
align-content 반대축 justify-content와 비슷 nowrap일 경우 의미 없음

Item 속성 (flex 요소)

order 아이템 속성을 변경할 수 있음
flex-grow 화면사이즈 증가시 특정 아이템 가중치(0~1)
flex-shrink 화면사이즈 감소시 특정 아이템 가중치(0~1)
flex-basis 화면사이즈 변경시 아이템별 가중치를 퍼센트(%) 로 지정
align-self 컨테이너와 배치 상속하지 않고 아이템만 따로  설정

2.  중심축과 반대축 이해하기 

flxe-direction을 row 로 할 경우 중심축은 수평선 (파랑색) 이며 되며 반대축은 수직선이 된다. 

flexl-direction을 column으로 하면 수직선이 중심축이 된다. 

3. justify-content, align-content  값 

참고 : https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content

flex-start 왼쪽에서 부터 정렬
flex-end 오른쪽에서 정렬
space-around 플렉스 요소는 앞, 뒤, 그리고 요소들 사이에도 모두 여유 공간을 두고 배치 (간격 1:2:2:2:1)
space-evenly 플렉스 요소를 일정한 크기로 배치 (간격 1:1:1:1:1)
space-between 플렉스 요소는 요소들 사이에만 여유 공간을 두고 배치됩니다.  (간격 3:3:3)

 

https://github.com/FortAwesome/vue-fontawesome

 

FortAwesome/vue-fontawesome

Font Awesome 5 Vue component. Contribute to FortAwesome/vue-fontawesome development by creating an account on GitHub.

github.com

위 링크를 참조하였음

 

NPM 으로 설치

$ npm i --save @fortawesome/fontawesome-svg-core
$ npm i --save @fortawesome/free-solid-svg-icons
$ npm i --save @fortawesome/vue-fontawesome

vue /src/main.js 에서 설정

import { library as faLibrary } from '@fortawesome/fontawesome-svg-core'
import { faHome, faSearch, faPlus } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

// Set up FontAwesome
faLibrary.add(faHome, faSearch, faPlus)
Vue.component('font-awesome-icon', FontAwesomeIcon)

화면에서 사용

<font-awesome-icon icon="plus" />

context/index.js


import React, { Component, createContext} from 'react'

const context = createContext()

const { Provider , Consumer: SimpleConsumer } = context

class TodoProvider extends Component {

    state = {
        idx: 0,
        todos : [
            { idx: 0 , text:'test', checked : false }
        ]
    }

    actions = {
        insert_todo : (value) => {

            let new_idx = this.state.idx
            new_idx++

            this.setState({
                idx: new_idx,
                todos: [
                    ...this.state.todos,
                    {
                        idx: new_idx,
                        text: value,
                        checked: false
                    }
                ]
            })

        },
        delete_todo: (idx) => {
            this.setState( {
              ...this.state,
              todos: this.state.todos.filter((data) => data.idx !== idx)
          })
        },
        toggle_todo: (idx) => {
            this.setState( {
                ...this.state,
                todos: this.state.todos.map( (data) => {
                    if(data.idx === idx){
                        data.checked = !data.checked
                    }
                    return data
                })
            })
        }
    }


    render() {

        const { state, actions } = this
        const value = {state , actions }
        return (
            <Provider value={value}>
                {this.props.children}
            </Provider>
        )
    }
}

export {
    TodoProvider, SimpleConsumer
}

App.js


import React from 'react';
import { TodoProvider } from './context/index'
import TodoList from './components/TodoList'
import TodoInsert from './components/TodoInsert'
import './App.css';

function App() {
  return (
      <TodoProvider>
        <div className="App">
          <TodoList/>
          <TodoInsert/>
        </div>
      </TodoProvider>
  );
}

export default App;

components/TodoInsert.js


import React, { Fragment, Component } from 'react'
import { SimpleConsumer } from '../context/index'
import styled from 'styled-components'

class Todo extends Component {

    state = {
        input : ''
    }

    handleChange = (e) => {
        this.setState({
            input: e.target.value
        })
    }

    handleSave = (e) => {
        this.props.setValue(this.state.input)
        this.setState({input : ''})
    }

    handleUp = (e) => {
        if(e.keyCode === 13){
            this.handleSave()
        }
    }


    render() {
        return (
            <Fragment>
                <Input type="text" value={this.state.input} 
                onChange={this.handleChange} 
                onKeyDown={this.handleUp}>
                </Input>
                <button onClick={this.handleSave}>저장</button>
            </Fragment>
        )
    }
}

const Input = styled.input`
    margin-left: 20px;
    width: 250px;
    margin-right: 5px;
`


const SendsContainer = () => (
    <SimpleConsumer>
        {
            ({actions})=> (
                <Todo setValue={actions.insert_todo}/>
            )
        }
    </SimpleConsumer>
)

export default SendsContainer

components/TodoList.js


import React from 'react'
import { SimpleConsumer } from '../context/index'
import styled from 'styled-components'

const list = () => {
    return (
        <ul>
            <SimpleConsumer>
                {
                    ({state, actions}) => {
                        return state.todos.map(t =>
                            <Li key={t.idx}>
                                <Span done={t.checked ? true : false} onClick={ (e) =>
                                    actions.toggle_todo(t.idx)
                                }>{t.text}</Span>
                                <Button onClick={ (e) =>
                                    actions.delete_todo(t.idx)
                                }>삭제</Button>
                            </Li>
                        )
                    }

                }
            </SimpleConsumer>
        </ul>
    )
}

const Li = styled.li`
    width: 280px;
    position: relative;
    margin: 3px;
`

const Span = styled.span`
   text-decoration : ${props => props.done ? "line-through" : "none"};
   cursor: pointer;
`

const Button = styled.button`
    position: absolute;
    right:0;
`

export default list

https://velog.io/@taewo/리액트-Styled-Components-76jsolbaf8

div 태그 안에 요소를 화면 정중앙에 배치시키는 방법


display: flex;
height: 100%; 
justify-content: center; 
align-items: center;
웹서비스 이해하려고 노력중이지만 아직 뭔 개념이 많은지.. 해매고 있다가 웹에서 찾은 이클립스 셋팅 방법을 보고 
나름대로 정리하려고 한다. 그분께 감사하고 링크를 걸려고 했는데 못 찾겠당.. ㅎㄷㄷ 

기본적으로 자바설치와 톰켓 설치는 되어 있다. (톰켓은 설치라기 보다는 그대로 받아서 특정폴더에 위치) 

또한 가니메데(이클립스) 버전을 사용하고 있다.


흠... 막막하다. ㅋㄷ 이제 시작


http://ws.apache.org/axis2/download/1_4_1/download.cgi  
Standard Binary Distributionzip파일을 다운 받는다.(오른쪽 끝에 있다)

다운을 받은 후 압축을 풀어서 C폴더나 넣고 싶은데 넣는다. (예: C:\axis2-1.4)

다시 이클립스로 돌아와서 [Window] - [Prefrences] 클릭한다. 


폴더를 잡아 달라고 하는 것 같다. (느낌상)... 


오 success .. ok를 누르고 닫는다. 


[File]-[New]-[Other]를 선택하고 Dynamic Web Project를 선택한다. (다른 프로젝트도 되지 않을까??  안해봤다.)


Target Runtime을 설정하여 준다. New를 누른다. 




JRE까지 설정(필수 아님) 하고 Finish를 누른다. 


Configuration에서 Modify를 누르자 


Axis2 나온 부분을 전부 체크하고 OK를 누른다. 

[Window] - [Show View] - [Other..] 누르고 Server를 선택하여 서버창을 보이게 하자 


이렇게 하면 서버창이 하단에 보인다. (나만 어려운 건가??? ㅋㄷ)


서버를 추가한다. 



적당히 선택하고 Finish....  추가해 준다. 


밑에 파란줄로 되어 있는 부분을 두번 클릭하니 이 화면이 나온다.  왼쪽 밑에 체크하고  서버를 시작한다. 


이걸 모르진 않겠지만 ㅋㅋㅋㅋ 


이 화면이 나온다면 제대로 설치 완료된 것이다. (http://localhost:8080/server/axis2-web/)

Services라는 것을 눌러보자 


머 서비스하는게 기본적으로 Version보여주는 것이 설치 되어 있다고 한다. 갑자기 크롬에서 IE로 바꾼 이유는 xml이 안 보이네 크롬에서 .ㅋㄷ  Version을 눌려보면 WSDL이 나온다. 

간단한 테스트 get방식으로 테스트가 가능하다. 주소창에 
http://localhost:8080/server/services/Version/getVersion 입력 


이 화면이 나온다면 정상적으로 응답을 받은 것이다. 흠.. 자바파일을 만들어서 하는 테스트는 다음 번에 써야겠다. 
화면캡처가 힘들구나... 쩝 실제 화면인지 알고 캡처한 그림을 클릭하는 실수를... 뜨헉.. 


웹표준이 요즘 대세이기는 하다. 나도 ms 브라우저 보다는 다른 브라우저가 끌리기 때문일지도 모른다.
개발자로서 어떤 사용자가 접근해도 디자인이 동일하고 불편함이 없는 것을 이끌어내는 것이 의무감 처럼 느껴진다. 
요즘 회사에서 게시판을 만들고 있는데 달력이 웹표준에 맞지 않아 jQuery UI에 있는 달력을 가져왔다. 
한글입력과 년도와 월을 나오게 하는데 고생좀 하였지만 그동안 몰랐던 css에 대해서도 많이 알게 되었다.



어떤 화면이 나올까? 색깔 있는것으로 CSS를 조정하였다. CSS float이 정렬인지 모르고 해메다니.. 
암튼 겨우 적용시킨 것 같다. 

+ Recent posts