一、定义弹窗组件

使用js去调用组件

component.png
index.js

1-1 JS配置弹窗组件

  1. <template>
  2. <div class="msgBox">
  3. <h2>{{title}}</h2>
  4. <p>{{content}}</p>
  5. <div class="msg-btn">
  6. <div @touchstart="handleCancel">{{cancel}}</div>
  7. <div @touchstart="handleOk">{{ok}}</div>
  8. </div>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. name:"MsgBox"
  14. }
  15. </script>
  1. import Vue from 'vue';
  2. import MsgBox from './MsgBox';
  3. export var msgBox = (function(){
  4. var defaults = {
  5. title:"",
  6. content:"",
  7. cancel:"",
  8. ok:"",
  9. handleCancel:null,
  10. handleOk:null
  11. };
  12. var MyComponent = Vue.extend(MsgBox);
  13. return function(opts){
  14. //配置参数
  15. for(var attr in opts){
  16. defaults[attr] = opts[attr];
  17. }
  18. var vm = new MyComponent({
  19. el:document.createElement("div"),
  20. data:{
  21. title:defaults.title,
  22. content:defaults.content,
  23. cancel:defaults.cancel,
  24. ok:defaults.ok
  25. },
  26. methods:{
  27. handleCancel(){
  28. defaults.handleCancel && defaults.handleCancel.call(this);
  29. document.body.removeChild(vm.$el)
  30. },
  31. handleOk(){
  32. defaults.handleOk && defaults.handleOk.call(this)
  33. document.body.removeChild(vm.$el)
  34. }
  35. }
  36. })
  37. document.body.appendChild(vm.$el)
  38. }
  39. })();

1-2 调用弹窗组件

  1. import {msgBox} from '@/components/JS'
  2. export default {
  3. name: "Movie",
  4. mounted(){
  5. msgBox({
  6. title:"定位",
  7. content:"武汉",
  8. cancel:"取消",
  9. ok:"切换城市",
  10. handleCancel(){
  11. console.log(1)
  12. },
  13. handleOk(){
  14. console.log(2)
  15. }
  16. })
  17. }
  18. };
  19. </script>

二、切换定位城市

src/views/Movie/index.vue中调用组件

2-1 首先获取当前城市

  1. import { msgBox } from "@/components/JS";
  2. export default {
  3. name: "Movie",
  4. components: {
  5. MovieNav
  6. },
  7. mounted() {
  8. this.axios.get("/api/getLocation").then(res => {
  9. var data = res.data.data;
  10. var city = data.nm;
  11. });
  12. }
  13. };
  14. </script>

2-2 延时3s显示弹窗

  1. mounted() {
  2. setTimeout(() => {
  3. this.axios.get("/api/getLocation").then(res => {
  4. var data = res.data.data;
  5. var city = data.nm;
  6. msgBox({
  7. title: "定位",
  8. content: city,
  9. cancel: "取消",
  10. ok: "切换城市",
  11. handleCancel() {
  12. console.log(1);
  13. },
  14. handleOk() {
  15. }
  16. });
  17. });
  18. }, 3000);

2-3 切换缓存中的定位城市

  1. handleOk() {
  2. localStorage.setItem("city",city);
  3. localStorage.setItem("cityId",data.id);
  4. location.reload()
  5. }

2-4 判断vuex中的city和当前定位获取的city

如果vuex中的city和通过定位获取的city一样,就不需要弹窗了

  1. mounted() {
  2. setTimeout(() => {
  3. this.axios.get("/api/getLocation").then(res => {
  4. var data = res.data.data;
  5. var city = data.nm;
  6. //判断定位城市
  7. if(this.$store.state.city ===city){
  8. return false;
  9. }
  10. msgBox({
  11. title: "定位",
  12. content: city,
  13. cancel: "取消",
  14. ok: "切换城市",
  15. handleCancel() {
  16. console.log(1);
  17. },
  18. handleOk() {
  19. localStorage.setItem("city",city);
  20. localStorage.setItem("cityId",data.id);
  21. location.reload()
  22. }
  23. });
  24. });
  25. }, 3000);
  26. }