ホームページ  >  記事  >  ウェブフロントエンド  >  Vue でプロンプトのようなポップアップ ボックスを実装するにはどうすればよいですか?

Vue でプロンプトのようなポップアップ ボックスを実装するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-06-25 12:52:553539ブラウズ

Vue でプロンプトのようなポップアップ ボックスを実装するにはどうすればよいですか?

フロントエンド開発では、ポップアップ ボックス、特にプロンプ​​トに似たポップアップ ボックスは非常に一般的なコンポーネントです。 Vue フレームワークは多くのコンポーネントを提供しますが、プロンプト ポップアップ ボックスを直接実装するコンポーネントはありません。では、Vue でプロンプトに似たポップアップ ボックスを実装するにはどうすればよいでしょうか?この記事では、いくつかの実装方法を簡単に紹介します。

方法 1: Vue 独自の $emit を使用する

Vue では、各 Vue インスタンスに組み込みの $emit メソッドがあります。これを使用してイベントをカスタマイズし、コンポーネントでこのイベントをリッスンすることができます。この機能を使用してポップアップ ボックスを実装できます。

まず、ポップアップ ボックスをポップアップする必要があるコンポーネントで、$emit を使用してイベントをカスタマイズできます。このイベントでは、ポップアップ ボックスに必要なパラメーターを渡すことができます:

Vue.component('prompt', {
  template: `
    <div>
      <div v-if="visible" class="mask">
        <div class="prompt-box">
          <h3>{{title}}</h3>
          <input type="text" v-model="inputValue">
          <button @click="close('cancel')">取消</button>
          <button @click="close('ok')">确定</button>
        </div>
      </div>
    </div>
  `,
  props: {
    title: {
      type: String,
      default: '请输入'
    },
    visible: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      inputValue: ''
    }
  },
  methods: {
    close(val) {
      if (val === 'ok') {
        this.$emit('ok', this.inputValue)
      } else {
        this.$emit('cancel')
      }
    }
  }
})

次に、親コンポーネントで、このカスタム イベントをリッスンし、v-model を使用して入力ボックスの値を双方向バインドします。

<template>
  <div>
    <button @click="showPrompt = true">弹出提示框</button>
    <prompt title="请输入内容" :visible="showPrompt" @cancel="showPrompt = false" @ok="handleOk"></prompt>
  </div>
</template>
 
<script>
import Prompt from './prompt.vue'
export default {
  components: {
    Prompt
  },
  data() {
    return {
      showPrompt: false,
      inputValue: ''
    }
  },
  methods: {
    handleOk(val) {
      this.showPrompt = false
      this.inputValue = val
    }
  }
}
</script>

方法 2: Vuex 状態管理を使用する

ポップアップ ボックスを複数のコンポーネントで使用する必要があり、多くのパラメーターを渡す必要がある場合は、Vuex 状態管理を使用して実現できます。

まず、Vuex に新しい状態を追加して、ポップアップ ボックスのステータスとパラメーターを保存します。

state: {
  isPromptShow: false,
  promptData: {
    title: '',
    inputPlaceholder: '',
    inputValue: ''
  }
}

次に、ポップアップ ボックスをポップアップする必要があるコンポーネントで、次のようにします。 $store.commit メソッドを使用して変更します。isPromptShow とプロンプトデータのステータス:

methods: {
  showPrompt() {
    this.$store.commit('setPromptData', {
      isPromptShow: true,
      promptData: {
        title: '请输入',
        inputPlaceholder: '请输入内容',
        inputValue: ''
      }
    })
  }
}

ポップアップ ボックスのコンポーネントで、mapState と mapMutations を使用して Vuex のステータスを取得し、ミューテーションを送信することで、次のことを実現できます。ポップアップ ボックスのイベント応答ロジック:

<template>
  <div v-if="isPromptShow" class="mask">
    <div class="prompt-box">
      <h3>{{promptData.title}}</h3>
      <input type="text" :placeholder="promptData.inputPlaceholder" v-model="promptData.inputValue">
      <button @click="closePrompt('cancel')">取消</button>
      <button @click="closePrompt('ok')">确定</button>
    </div>
  </div>
</template>
 
<script>
import { mapState, mapMutations } from 'vuex'
export default {
  computed: {
    ...mapState(['isPromptShow', 'promptData'])
  },
  methods: {
    ...mapMutations({
      setPromptData: 'SET_PROMPT_DATA'
    }),
    closePrompt(val) {
      if (val === 'ok') {
        this.$emit('ok', this.promptData.inputValue)
      } else {
        this.$emit('cancel')
      }
      this.setPromptData({ isPromptShow: false })
    }
  }
}
</script>

vuex の isPromptShow の状態を変更する

mutations: {
  SET_PROMPT_DATA(state, data) {
    state.isPromptShow = data.isPromptShow
    state.promptData = data.promptData
  }
}

親コンポーネントでは、Vuex の mapState を使用して isPromptShow とプロンプトデータを取得するだけでなく、ただし、mapActions を使用して Vuex でミューテーションを送信するメソッドを呼び出す必要もあります:

<template>
  <div>
    <button @click="showPrompt">弹出提示框</button>
    <prompt v-if="isPromptShow" @ok="handleOk" @cancel="closePrompt"></prompt>
  </div>
</template>
 
<script>
import Prompt from './prompt.vue'
import { mapState, mapActions } from 'vuex'
export default {
  components: {
    Prompt
  },
  computed: {
    ...mapState(['isPromptShow', 'promptData'])
  },
  methods: {
    ...mapActions(['setPromptData']),
    showPrompt() {
      this.setPromptData({
        isPromptShow: true,
        promptData: {
          title: '请输入',
          inputPlaceholder: '请输入内容',
          inputValue: ''
        }
      })
    },
    closePrompt() {
      this.setPromptData({ isPromptShow: false })
    },
    handleOk(val) {
      console.log(val)
      this.setPromptData({ isPromptShow: false })
    }
  }
}
</script>

方法 3: サードパーティ ライブラリを使用する

上記 2 つの方法が面倒だと思う場合は、実際に、サードパーティのライブラリを使用してプロンプトのようなポップアップ ボックスを実装することを検討できます。現在人気のあるサードパーティ ライブラリには、ElementUI、Vuetify、iView などが含まれます。これらのライブラリは、プロンプトに似た非常に実用的なポップアップ コンポーネントを提供します。

たとえば、ElementUI コンポーネント ライブラリには MessageBox ポップアップ ボックスがあります。

this.$confirm('内容', 'title', {
  confirmButtonText: '确定',
  cancelButtonText: '取消',
  type: 'warning'
}).then(() => {
  // 点击确定回调
}).catch(() => {
  // 点击取消回调
})

まとめ

この記事では主に、プロンプトのようなポップを実装する 3 つの方法を紹介します。 Vue の -up ボックス $emit、Vuex 状態管理、サードパーティ ライブラリを使用しています。各方法には独自の特徴と適用可能なシナリオがあり、特定の状況に応じて選択する必要があります。

以上がVue でプロンプトのようなポップアップ ボックスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。