Vue 全局登录注册弹框

登录组件,登录跳转到注册有传参数

<template>
  <el-dialog
    :visible.sync="show"
    :append-to-body="true"
    :show-close="false"
    width="670px"
  >
      <h1>欢迎登陆</h1>
      <div>
        <el-button @click="reg(false)">个人注册</el-button>
        <el-button @click="reg(true)">机构注册</el-button>
      </div>
  </el-dialog>
</template>

<script>
export default {
  data() {
    return {
      show: false,
    };
  },
  created() {
  },
  mounted() {},
  methods: {
    reg(e){
      setTimeout(()=>{
        this.$Reg({isOrganization:e})
      },500)
      this.show=false;
    }
  },
  computed: {
  },
  watch: {
    
  },
  components: {
  },
};
</script>

<style lang="scss" scoped>
</style>


注册组件

<template>
  <el-dialog
    :visible.sync="show"
    :append-to-body="true"
    :show-close="false"
     width="1000px"
  >
    <div slot="title" class="d-flex justify-content-between height50">
      <div class="dialogTitle">账号注册</div>
      <div class="font-14">
        已有账号?立即
        <span class="hand primaryCplor" @click="login">登录</span>
      </div>
    </div>
    <div class="dialogBody">
      <div class="text-center">
        <span
          class="tab hand"
          :class="{ parimaryBG: !isOrganization }"
          @click="isOrganization = false"
          >个人注册</span
        >
        <span
          class="tab hand"
          :class="{ parimaryBG: isOrganization }"
          @click="isOrganization = true"
          >机构注册</span
        >
      </div>
      <div class="mt-20">
        <div v-show="!isOrganization">
          <el-form :model="personelFrom" :rules="rules" ref="personel">
            <div class="border-bottom">
              <div class="typeTitle">账户信息</div>
            </div>
            <el-form-item label="用户名:" prop="name" class="">
              <el-input
                v-model="personelFrom.name"
                size=""
                :placeholder="placeholder.name"
              ></el-input>
            </el-form-item>
            <el-form-item label="手机号:" prop="name" class="">
              <el-input
                v-model="personelFrom.name"
                :placeholder="placeholder.phone"
              ></el-input>
            </el-form-item>
            <el-form-item label="图片验证码:" prop="code" class="">
              <el-input
                v-model="personelFrom.code"
                :placeholder="placeholder.code"
              >
                <div slot="append">
                  <img
                    class="code"
                    src=""
                    alt="imgCode"
                  />
                </div>
              </el-input>
            </el-form-item>
            <el-form-item label="短信验证码:" prop="phoneCode" class="">
              <el-input
                v-model="personelFrom.phoneCode"
                :placeholder="placeholder.phoneCode"
              >
                <template slot="suffix">
                  <span class="primaryCplor mr-10">获取短信验证码</span>
                </template>
              </el-input>
            </el-form-item>
            <el-form-item label="登录密码:" prop="password" class="">
              <el-input
                v-model="personelFrom.password"
                :placeholder="placeholder.password"
              ></el-input>
            </el-form-item>
            <el-form-item label="确认密码:" prop="passwordTest" class="">
              <el-input
                v-model="personelFrom.passwordTest"
                :placeholder="placeholder.passwordTest"
              ></el-input>
            </el-form-item>
            <el-form-item>
              <el-button
                type="primary"
                @click="onSubmit('personel')"
                class="W-100 mt-20 parimaryBG border0"
                >注册</el-button
              >
            </el-form-item>
          </el-form>
        </div>
        <div v-show="isOrganization">
          <el-form :model="organizationForm" :rules="rules" ref="organization">
            <div class="typeTitle">机构信息</div>
            <el-form-item label="机构类型:" prop="organizationType" class="">
              <el-radio-group v-model="organizationForm.organizationType" class="W-100">
                <el-radio label="法人"></el-radio>
                <el-radio label="非法人组织"></el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="用户名:" prop="name" class="">
              <el-input
                v-model="organizationForm.name"
                :placeholder="placeholder.name"
              ></el-input>
            </el-form-item>
            <el-form-item label="单位名称:" prop="company" class="">
              <el-input v-model="organizationForm.company"  :placeholder="placeholder.company"></el-input>
            </el-form-item>
            <el-form-item label="统一社会信用代码:" prop="socialCreditCode" class="">
              <el-input v-model="organizationForm.socialCreditCode"  :placeholder="placeholder.socialCreditCode"></el-input>
            </el-form-item>
            <el-form-item label="登录密码:" prop="password" class="">
              <el-input
                v-model="organizationForm.password"
                :placeholder="placeholder.password"
              ></el-input>
            </el-form-item>
            <el-form-item label="确认密码:" prop="passwordTest" class="">
              <el-input
                v-model="organizationForm.passwordTest"
                :placeholder="placeholder.passwordTest"
              ></el-input>
            </el-form-item>
            <div class="typeTitle">经办人信息</div>
            <el-form-item label="经办人姓名:" prop="transactorName" class="">
              <el-input v-model="organizationForm.transactorName"  :placeholder="placeholder.transactorName"></el-input>
            </el-form-item>
            <el-form-item label="身份证号码:" prop="IDCard" class="">
              <el-input v-model="organizationForm.IDCard"  :placeholder="placeholder.IDCard"></el-input>
            </el-form-item>
            <el-form-item label="电子邮箱:" prop="email" class="">
              <el-input v-model="organizationForm.email"  :placeholder="placeholder.email"></el-input>
            </el-form-item>
            <el-form-item label="手机号:" prop="phone" class="">
              <el-input
                v-model="organizationForm.phone"
                :placeholder="placeholder.phone"
              ></el-input>
            </el-form-item>
            <el-form-item label="图片验证码:" prop="code" class="">
              <el-input
                v-model="organizationForm.code"
                :placeholder="placeholder.code"
              >
                <div slot="append">
                  <img
                    class="code"
                    src=""
                    alt="imgCode"
                  />
                </div>
              </el-input>
            </el-form-item>
            <el-form-item label="短信验证码:" prop="phoneCode" class="">
              <el-input
                v-model="organizationForm.phoneCode"
                :placeholder="placeholder.phoneCode"
              >
                <template slot="suffix">
                  <span class="primaryCplor mr-10">获取短信验证码</span>
                </template>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-button
                type="primary"
                @click="onSubmit('organization')"
                class="W-100 mt-20 parimaryBG border0"
                >注册</el-button
              >
            </el-form-item>
          </el-form>
        </div>
      </div>
    </div>
  </el-dialog>
</template>

<script>
export default {
  data() {
    return {
      isOrganization: false, //是否是组织
      show: false,
      placeholder: {
        name: "5-25个字符,可使用字母、数字、下划线,需以字母开头",
        phone: "请填写常用号码",
        code: "请填写图片验证码",
        phoneCode: "请填写短信验证码",
        password: "8-20个字符,至少包含一个大写字母,一个小写字母跟一个数字",
        passwordTest: "请再次填写密码",
        company: "请输入单位名称",
        socialCreditCode: "请输入统一社会信用代码",
        transactorName: "请填写真实姓名",
        IDCard: "请填写身份证号码",
        email: "请填写注册人邮箱",
      },
      personelFrom: {
        name: "",
        phone: "",
        code: "",
        phoneCode: "",
        password: "",
        passwordTest: "",
      },
      organizationForm: {
        name: "",
        organizationType:"法人",
        phone: "",
        code: "",
        phoneCode: "",
        password: "",
        passwordTest: "",
        company: "",
        socialCreditCode: "",
        transactorName: "",
        IDCard: "",
        email: "",
      },
      rules: {
           name: [
          { required: true, message: "请输入需求名称", trigger: "blur" },
          { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" },
        ],
        phone: [
          { required: true, message: "请输入需求名称", trigger: "blur" }
        ],
        code: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        phoneCode: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        password: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        passwordTest: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        company: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        socialCreditCode: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        transactorName:[ { required: true, message: "请输入需求名称", trigger: "blur" },],
        IDCard: [ { required: true, message: "请输入需求名称", trigger: "blur" },],
        email:[ { required: true, message: "请输入需求名称", trigger: "blur" },],
      },
    };
  },
  created() {},
  mounted() {},
  methods: {
    onSubmit(formName) {
      
    },
    login(){
        setTimeout(()=>{
          this.$Login();
      },500)
      this.show=false;
    }
  },
  computed: {
  },
  watch: {
  },
  components: {},
};
</script>
<style scoped>
.el-dialog__wrapper /deep/ .el-dialog__header {
  padding: 0 20px;
}
.el-form-item {
  margin-bottom: 10px;
}
</style>
<style lang="scss" scoped>
$-primary: #4cad95;
.height50 {
  height: 50px;
  line-height: 50px;
}
.dialogTitle {
  color: $-primary;
  border-bottom: 2px solid $-primary;
  padding: 0 10px;
}
.primaryCplor {
  color: $-primary;
}
.dialogBody {
  margin: 0 240px;
  .tab {
    margin: 0 8px;
    border: 1px solid $-primary;
    padding: 6px 26px;
    font-size: 14px;
    color: $-primary;
    border-radius: 2px;
  }
  .parimaryBG {
    background: $-primary;
    color: #fff;
  }
  .border-bottom {
    border-bottom: 1px solid #ccc;
    margin: 40px 0 20px 0;
  }
  .typeTitle {
    height: 45px;
    line-height: 45px;
    font-size: 14px;
    color: $-primary;
    border-bottom: 1px solid $-primary;
    display: inline-block;
  }
  .code {
    height: 34px;
  }
}
</style>

封装test.js导出组件

import Vue from 'vue'
import Login from './login.vue'
import Register from './register.vue'

const LoginBox = Vue.extend(Login)
const regBox = Vue.extend(Register)

LoginBox.install = function () {
  let instance = new LoginBox({
  }).$mount()
  Vue.nextTick(() => {
    instance.show = true
  })
}
regBox.install = function (options) {
  if (options === undefined || options === null) {
    options = { isOrganization: false }
  } else {
    options = options;
  }
  let instance = new regBox({
    data: options
  }).$mount()
  Vue.nextTick(() => {
    instance.show = true
  })
}
export { LoginBox, regBox }

main.js中全局引入

import {LoginBox,regBox} from '@/components/testPage/test'
Vue.prototype.$Login = LoginBox.install;
Vue.prototype.$Reg = regBox.install;

未登录状态下路由守卫中引入使用

import {LoginBox} from '@/components/testPage/test'


// 全局路由守卫
router.beforeEach((to, from, next) => {
    // to: Route: 即将要进入的目标 路由对象
    // from: Route: 当前导航正要离开的路由
    // next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    
    if (to.meta.permission) {
        if(!store.state.token){
            if (!from.name) {
                router.push({ name: "index" })
            } else {
                ;LoginBox.install()
            }
        }else{
            next();
        }
    } else {
        next();
    }
});
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要在Vue应用程序中实现全局弹框的控制,你可以使用Vue.js提供的全局事件总线(Event Bus)机制。 以下是一个简单的实现: 1.在Vue实例中创建一个事件总线: ``` // main.js import Vue from 'vue' export const EventBus = new Vue() ``` 2.在需要弹框的组件中,通过事件总线触发一个事件: ``` // MyComponent.vue import { EventBus } from '@/main' methods: { showModal () { EventBus.$emit('show-modal') } } ``` 3.在包含弹框的组件中,监听事件并控制弹框的显示与隐藏: ``` // ModalComponent.vue import { EventBus } from '@/main' data () { return { showModal: false } }, created () { EventBus.$on('show-modal', () => { this.showModal = true }) }, methods: { closeModal () { this.showModal = false } } ``` 通过这种方式,你可以在任何组件中触发事件并控制全局框的显示与隐藏。当然,你也可以通过传递参数来实现更复杂的逻辑。 ### 回答2: Vue全局弹框JS控制主要包括以下几个步骤: 第一步,导入Vue和第三方弹框插件,可以使用import语句导入。 第二步,创建一个Vue实例,用于管理全局弹框相关的数据和方法。 第三步,定义全局弹框的属性和方法,如弹框的显示状态、标题、内容、确认按钮、取消按钮等。 第四步,将全局弹框挂载到Vue实例上,并使用Vue的插件机制将该实例注册全局组件。 第五步,使用组件的方式来调用全局弹框,可以直接在Vue实例中使用该组件,或者通过事件触发、计算属性、方法等方式来控制弹框的显示和隐藏。 第六步,根据实际需求,可以在全局弹框中添加一些自定义配置项,如弹框的宽度、高度、位置等。 第七步,封装全局弹框的方法,使其支持链式调用,方便在代码中使用。 第八步,对全局弹框的样式进行自定义,可以通过CSS样式文件或者内联样式灵活地修改弹框的样式。 总而言之,通过上述步骤,我们可以在Vue中实现全局弹框的JS控制,方便在整个项目中管理和调用弹框组件,提高开发效率和代码复用性。 ### 回答3: Vue全局弹框JS控制是通过Vue.js的全局对象$emit和$on来实现的。为了实现统一的弹框控制,可以借助Vue的事件总线机制。 首先,在main.js中创建一个Vue实例,作为事件总线: ``` import Vue from 'vue' export const EventBus = new Vue() Vue.prototype.$bus = EventBus ``` 然后,在需要弹框组件中,可以通过以下方式触发一个全局事件: ``` this.$bus.$emit('show-dialog', dialogData) ``` 其中,'show-dialog'是自定义的事件名称,dialogData是传递给弹框的数据。 接着,在根组件全局组件中监听该事件,并根据需求进行处理。可以通过以下方式在组件中监听事件: ``` this.$bus.$on('show-dialog', (dialogData) => { // 处理弹框逻辑,比如弹一个全局弹框组件,并将dialogData传递给它 }) ``` 在监听到事件后,在组件中进行相应的处理,比如将dialogData传递给全局弹框组件,并弹。 通过以上步骤,就可以实现Vue全局弹框的控制了。无论在哪个组件中需要弹框,只需要触发全局事件,然后在根组件全局组件中进行监听和处理,实现了弹框的统一控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值