iT邦幫忙

0

【已解決】Vite with Vue3中如何使用emit

你好,
我想請教一個問題。
在Vite、Vue3的框架中,要怎麼使用emit呢?

因為我想自製一個彈出視窗的表單,圖與程式碼如下:
(將彈出視窗做成一個button元件,按下button表單就會顯示):


程式碼:

//App.vue
<script setup>
 import ButtonNext from './components/ButtonNext.vue'
</script>

<template>
  <ButtonNext />
</template>
<style>
  body{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
</style>
//ButtonNext.vue
<script setup>
  import { ref } from 'vue'
  import FormOne from './FormOne.vue'
  //開啟
  const show_pop_up =ref(false)
  const pop_up=function(){
    show_pop_up.value=true
  }
  //關閉


</script>

<template>
    //開啟or隱藏表單
    <div :class="{active:!show_pop_up}">
      <div class="bg_gray"></div>//表單的灰色背景
      <div id="myModal">//表單的group,之後會v-if"name == 表單名稱"去選取表單
        <FormOne />
      </div>
    </div>
    <button @click="pop_up">//按鈕
      下一步
    </button>
</template>
<style scoped>
.active{
    display: none;
}
    .bg_gray{
        width: 100vw;
        height: 100vh;
        background-color: gray;
        opacity: 0.7;
        position: absolute;
        z-index: 2;
    }
    #myModal{
        width: 100vw;
        height: 100vh;
        position: absolute;
        z-index: 3;

        display: flex;
        justify-content: center;
        align-items: center;  
    }
        
</style>
//FormOne.vue
<script setup>
    import {ref} from 'vue'
    const click_cancel = function(){}
    const click_submit = function(){}
</script>

<template>  
    <form class="myForm">
        <h2>我是Title</h2>
        <input type="text" value="12313123">
        <div class="btnGroup">
            <button @click.prevent="click_cancel">取消</button>
            <button @click.prevent="click_submit">確認</button>
        </div>
    </form>
</template>
<style scoped>
.myForm{
    width: 300px;
    height: 500px;
    background-color: aquamarine;
    padding: 20px;
    position: relative;
}
    .btnGroup{
        position: absolute;
        z-index: 10;
        bottom: 30px;
        right: 30px;
    }
    .btnGroup button{
        margin-left: 10px;
    }
</style>

我想在FormOne.vue裡面,按下取消按鈕,去修改ButtonNext.vue的show_pop_up的值。
要怎麼辦呢?感謝。
還是有其他更好的方法可以參考?


已解決,感謝幫忙。
我想分享一下,給需要的人。
重點:defineProps與defineEmit皆在child組件裡定義。

//App.vue (parents)
<script setup>
  import Components from './Components.vue'

  const change = function(e){
    console.log(e);
  }
  const change2 = function(e){
    console.log(e);
  }
</script>
<template>
    <Components @change="change" @change2="change2" :foo='123'/>
</template>
//Components.vue (child)
<script setup>
    //定義emit跟props的變數
    const emit = defineEmits(['change', 'change2'])
    const props = defineProps({
        foo: String
    })
    //注意:props是個proxy,必須用物件的方式獲取變數值(props.foo)
    const click_cancel = function(){
        emit('change', false)
        console.log('我是props',props.foo);
    }
    const click_submit = function(){
        emit('change2', true)
        console.log('我是props',props.foo);
    }
</script>

<template>  
    <form>
        <button @click.prevent="click_cancel">取消</button>
        <button @click.prevent="click_submit">確認</button>
    </form>
</template>

如果大大對於彈出式表單有更好的寫法,可以分享一下嗎?感謝

Mike iT邦新手 4 級 ‧ 2021-10-04 17:29:58 檢舉
請參考
https://v3.vuejs.org/api/sfc-script-setup.html#defineprops-and-defineemits

尚未有邦友回答

立即登入回答