ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [classType vue] props/ 모달 상자 띄우기
    vue 2023. 2. 7. 16:10

    먼저  props 란

    부모 컴포넌트에서 ➡️ 자식 컴포넌트로 데이터를 전달할때 사용되어지는 단방향 데이터 전달 방식이다

     

     

    🔔수행하려는 동작 간단 정리

    현재 slot-scope의 record를 통해 'validationDataListConfig'라는 객체가 들어오고 있고

    record의 validate_result 값에 따라 모달 상자의 내용이 달라져야 하기 때문에 showModal함수의 인자로 넘겨줌.

     

    script에서 showModal함수를 통해 자식컴포넌트에게 validate_result값을 넘겨주어 ErrorModal을 띄울 것임.

    <template>
    . . .
    <span slot="validate_result" slot-scope="text, record">
     	<template v-if="record.validate_result == 'ERROR_OK'">
    		<div style="color: #288c28; font-weight: bold"><a-icon type="check" class="mr-1" />OK</div>
        </template>
        <template v-else>
        	<div @click="showModal(record.validate_result)" 
            	style="cursor: help; color: red; font-weight: bold;">🚨 {{ record.validate_result }}</div>
        </template>
    </span>
    <ErrorModal :errorModalVisible.sync="errorModalVisible" :validateErrorMsg="message" />
    . . .
    </template>

     

     

    <script lang="ts">
    . . .
    const validationDataListConfig = [
        {
            slots: { title: "ID" },
            dataIndex: "id",
            align: "center",
        },
        {
            slots: { title: "Name" },
            dataIndex: "name",
            align: "center",
        },
        {
            slots: { title: "Time" },
            dataIndex: "time",
            align: "center",
        },
    
        {
            title: "🛎 Start Time",
            scopedSlots: { customRender: "start_time" },
            /* eslint-disable @typescript-eslint/camelcase */
            dataIndex: "start_time",
            align: "center",
        },
        {
            /* eslint-disable @typescript-eslint/camelcase */
    
            title: "🛎 End Time",
            scopedSlots: { customRender: "end_time" },
            dataIndex: "end_time",
            align: "center",
        },
    
        {
            dataIndex: "validate_result",
            title: "📝 Validation Result",
            scopedSlots: { customRender: "validate_result" },
            align: "center",
        },
        {
            title: "✔ Uploaded",
            slots: { title: "Uploaded" },
            dataIndex: "uploaded",
            scopedSlots: { customRender: "uploaded" },
            align: "center",
        },
    ];
    
    
    @Component({
        components: {
         	. . .
            ErrorModal: () => import("@/views/data/ErrorModal.vue"),
        },
    })
    
    export default class DataValidationPage extends Base {
        private errorModalVisible = false;
        private showModal(record: any): void {
            this.editVisible = true;
            this.message = record;
            //alert("div클릭");
        }
    . . .
    }
    
    
    </script>

    자식 컴포넌트인 ErrorModal을 import시켜주고

     

    부모컴포넌트(DataValidationPage)에서 기본적으로 모달속성을 감추고 있다가 showModal함수가 작동될 때만 true로 바꿔주어 모달  visible속성을 핸들링 하고, 받았던 인자를 message에 저장한다. 

     

     

    그다음 자식컴포넌트 태그의 v-bind속성(축약된 형태 사용함)을 이용해 :props이름="전달데이터"형태로 값을 넘겨준다.

    <ErrorModal :errorModalVisible.sync="errorModalVisible" :validateErrorMsg="message" />

     

     

     

     

     

    부모에서 자식으로 넘겨주기 끝

    이제 자식 컴포넌트를 보자

     

    <template>
        <a-modal title="Error description" v-model="syncVisible">
            <template v-if="validateErrorMsg == 'L0_E02'">
                <h4>{{ validateErrorMsg }}</h4>
              
            </template>
            <template v-else-if="validateErrorMsg == ('L0_E11' || 'L0_E22')">
                <h4>{{ validateErrorMsg }}</h4>
              
            </template>
            <template v-else-if="validateErrorMsg == ('L0_E5' || 'L0_E07')">
                <h4>{{ validateErrorMsg }}</h4>
           
            </template>
            <template v-else-if="validateErrorMsg == 'L2_SIGNAL_E07'">
                <h4>{{ validateErrorMsg }} Timestamp Jump</h4>
               
            </template>
    
            <template v-else-if="validateErrorMsg == 'L2_SIGNAL_E04'">
                <h4>{{ validateErrorMsg }} (Signal frozen)</h4>
              
            </template>
            <template v-else-if="validateErrorMsg == 'L2_SIGNAL_E08'">
                <h4>{{ validateErrorMsg }} (Signal Jump)</h4>
               
            </template>
            <template v-else>
                <h4>{{ validateErrorMsg }}</h4>
            
            </template>
        </a-modal>
    </template>

     

    <script lang="ts">
    import { Component, Emit, Prop, PropSync, Vue } from "vue-property-decorator";
    @Component
    export default class TeamEdit extends Vue {
        @PropSync("errorModalVisible")
        private syncVisible!: boolean;
    
        @Prop() validateErrorMsg!: String;
        
        // private onClickClose(): void {
        //     this.syncVisible = false;
        // }
    }
    </script>
    <style scoped>
    p {
        margin-left: 5px;
    }
    </style>

    부모컴포넌트로부터 받은

    errorModalVisible syncVisible에 담아 모달의 visible속성을 핸들링한다.
    그리고 부모로부터 받은 message는 @Prop()을 통해 validateErrorMsg에 담아서 사용함.

     

     

    간단 요약

    <부모 vue>

    1.모달로 띄우고 싶은 자식vue template안에 넣어주고

       <ErrorModal :errorModalVisible.sync="errorModalVisible" :parentMessage="message" />

     

    2.특정 버튼 누르면 showModal호출

    <div @click="showModal(record.validate_result)" style="cursor: help; color: red; font-weight: bold">
        🚨 {{ record.validate_result }}
     </div>

     

    <부모 Script>

    3. 부모 스크립트에서 @Component에 자식 컴포넌트 import시켜주고

    @Component({
        components: {
           . . .
            ErrorModal: () => import("@/views/data/ErrorModal.vue"),
        },
    })

    4. export default에 visible변수랑 showModal함수 작성

    export default class DataValidationPage extends Base {
        private errorModalVisible = false;
        private showModal(record: any): void {
            this.errorModalVisible = true;
            this.message = record;
            //alert("div클릭");
        }

     

    <자식 Vue>

    1. syncVisible속성주고 모달 화면 구성 

    <template>
        <a-modal title="Error description" v-model="syncVisible">
        <p> modal description1 </p>
        </a-modal>
    </template>

     

    <자식 script>

    2. @PropSync, @Prop으로 부모에서 넘겨주는 데이터 받기

    <script lang="ts">
    import { Component, Emit, Prop, PropSync, Vue } from "vue-property-decorator";
    @Component
    export default class TeamEdit extends Vue {
        @PropSync("errorModalVisible")
        private syncVisible!: boolean;
    
        @Prop() private validateErrorMsg!: String;
    
        // private onClickClose(): void {
        //     this.syncVisible = false;
        // }
    }

     

    'vue' 카테고리의 다른 글

    package.json 사용자 지정 환경변수에 따른 동작 실행  (0) 2023.02.10
    vue modal props code  (0) 2023.02.08
Designed by Tistory.