본문 바로가기

IT

Vue.js를 처음 프로젝트에 사용하면서 찾아봤던 것들의 정리입니다.

Vue로 각종처리하면서 찾아봤던 것들의 정리입니다.

실제로 Front-End 작업을 경험할 수 있었어서 좋았으나 처음 계획했던 React.js를 포기는 아쉬움이 남습니다.

Vue와 좀더 친해지면 다시 React를 만나봐야겠습니다.

 

CDN(content delivery network)

Bootstrap, Vue.js, axios, jQuery를 사용했습니다.

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0"
            crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>

 

 

자바스크립트에서 Vue의 Method호출

Vue앱명.메소드명()로 접근, 호출합니다.

var sample = new Vue({
    el: '#sample'
    },
    
    methods: {
        sampleMethod: function (e) {
            console.log("Vue->Sample->sampleMethod")
        }
    }
});
<button type="button"
onclick="sample.sampleMethod()"
class="btn btn-primary"
id="sampleButton">Click</button>

 

 

Json의 데이터를 forEach로 접근

Uncaught TypeError:  .forEach is not a function 의 에러가 발생해서 대응한 내용입니다.

//샘플JSON
var gfriend = { 'sowon':'1995-12-07', 'yerin':'1996-08-19', 'eunha':'1997-05-30', 
'yuju':'1997-10-04', 'sinbi':'1998-06-03', 'umji':'1998-08-19'};

//forEach로 접근하는 경우 에러발생
//Uncaught TypeError: gfriend.forEach is not a function
gfriend.forEach(function (value,key) {
  console.log(key +"님의 생일은 " + value +" 입니다.");
});

//에러없이 잘 접근됩니다.
Object.keys(gfriend).forEach(function (key) {
  console.log(key + "님의 생일은 " + gfriend[key] + "입니다.");
});

 

 

폼(Form)의 유효성체크(Validation)

v-if, v-for, v-model

폼의 각 항목에 v-model를 설정, this.v-model설정명 으로 접근합니다.

var loginForm = new Vue({
    el: '#loginForm',
    data: {
        email: null,
        password: null,
        errors: [],
    },
    methods: {
        onSubmit: function (e) {

            this.errors = [];

            if (!this.email) {
                this.errors.push('메일어드레스를 입력해주세요.');
            }
            if (!this.password) {
                this.errors.push('패스워드를 입력해주세요.');
            }
            if (!this.errors.length) {
                
                //로그인 폼 송신
                
            }

        }
    }
});
<form id="loginForm" method="post">
    <p v-if="errors.length">
        <b>아래의 내용을 확인해주세요.</b>
        <ul>
            <li v-for="error in errors">{{ error }}</li>
        </ul>
    </p>
    <div class="mb-3">
        <label for="email" class="col-form-label">메일어드레스:</label>
        <input type="text" v-model="email" class="form-control" id="email" />
    </div>
    <div class="mb-3">
        <label for="password" class="col-form-label">패스워드:</label>
        <input type="password" v-model="password" class="form-control" id="password" />
    </div>
</form>
<button type="button" onclick="loginForm.onSubmit()" class="btn btn-primary" id="loginButton">
LOGIN
</button>

 

 

폼(Form) Post송신

FormData, JSON.stringify, axios

FormData에 폼의 각 항목을 담아, 오브젝트(키,값)로 변환, 최종적으로 JSON형식으로 변환해서 axios를 이용해 송신  

var loginForm = new Vue({
    el: '#loginForm',
    data: {
        email: null,
        password: null,
        errors: [],
    },
    methods: {
        onSubmit: function (e) {

            this.errors = [];

            if (!this.email) {
                this.errors.push('메일어드레스를 입력해주세요.');
            }
            if (!this.password) {
                this.errors.push('패스워드를 입력해주세요.');
            }
            if (!this.errors.length) {
                this.sendPost();
            }

        },

        async sendPost() {

            var formData = new FormData();
            formData.append('email', this.email);
            formData.append('password', this.password);

            var object = {};
            formData.forEach(function (value, key) {
                object[key] = value;
            });
            var json = JSON.stringify(object);

            var url = 'http://URL/api/login';
            await axios.post(url, json, {
                headers: {
                    'Content-Type': 'application/json',
                }
            }).then(res => {
                this.errors.push(res);
                this.success = true;
            }).catch((err) => {
                Object.keys(err.response.data.errors).forEach(function (key) {
                    this.errors.push(err.response.data.errors[key]);
                }, this);
                this.success = false;
            });

        }
    }
});

 

 

무한스크롤 (Infinity Scroll)

mounted, axios, v-for

contents배열을 v-for로 출력하도록 HTML을 작성하고 mounted, scroll이벤트로  axios를 이용해 외부데이터를 취득해 contents를 갱신

(테스트를 위해 같은 컨텐츠를 계속 가져오도록 했지만 실제에서는 페이징등 조건을 바꿔가며 가져오도록 처리)

<div class="content-container-list" id="vueContentList">

    <div class="card" v-for="(value,key) in contents">
        <div class="card-body">
            <h5 class="card-title">!{{ value.Title }}</h5>
        </div>
    </div>
    
</div>
<script type="text/javascript">
    $(window).scroll(function () {
        if ($(window).scrollTop() == $(document).height() - $(window).height()) {
            vueContentList.getContents();
        }
    });
</script>
var vueContentList = new Vue({
    el: '#vueContentList',
    data: {
        contents: []
    },
    methods: {
        async getContents() {
            var url = 'http://URL/api/getcontents'
            await axios.get(url).then(x => {
                if (this.contents.length) {
                    x.data.Contents.forEach(function (content) {
                        this.contents.push(content)
                    }, this)

                } else {

                    this.contents = x.data.Contents
                }

            })
        }
    },
    mounted() {
        this.getContents()
    }
});

 

 

이렇게 열심히 연구를 하고 ASP.NET Core WebAPI와 연동처리도 마쳤는데

1.  axios로 폼(Form)데이터를 Json으로 변환해서 송신한 경우 폼의 각 항목의 순서가 제멋데로 알파벳 순서로 바뀌어 버리는 문제

2. ASP.NET Core WebAPI+JWT(JSON Web Token)의 로그인처리

를 해결하지 못하고 시간적인 여유도 없어 ASP.NET Core MVC로 변경해야 할것 같습니다.

반응형