vue封装密码组件

今天封装了一个仿密码输入的组件,效果类似于微信的支付功能
该组件支持最大6位密码。使用v-model进行了数据的双向绑定。
使用的框架是vue2!!!
功能可能还不是非常完善,不过这篇文章知识提供一下个人思路,希望对您有所帮助!!!
效果图:
在这里插入图片描述

父组件:

<template>
  <div id="app">
    <div>
      <div>当前输入的密码是:{{ password }}</div>
      <div>当前的密码长度为:{{ length }}</div>
    </div>
    <Tab v-model="password" :len="length" />
  </div>
</template>

<script>
import Tab from "./components/Tab.vue"
export default {
  name: "App",
  data() {
    return {
      password: "",
      length: 6,
    }
  },
  components: { Tab },
}
</script>

<style></style>

子组件:

<template>
  <div @click="toFocus" class="card">
    <div style="text-align: center">请输入密码</div>
    <div class="group">
      <div class="item" v-for="(item, index) in len">
        <input
          v-if="index == 0"
          :value="input0"
          @input="handleChange($event, 0)"
          @keyup.delete="handleDelete($event, 0)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 1"
          :value="input1"
          @input="handleChange($event, 1)"
          @keyup.delete="handleDelete($event, 1)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 2"
          :value="input2"
          @input="handleChange($event, 2)"
          @keyup.delete="handleDelete($event, 2)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 3"
          :value="input3"
          @input="handleChange($event, 3)"
          @keyup.delete="handleDelete($event, 3)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 4"
          :value="input4"
          @input="handleChange($event, 4)"
          @keyup.delete="handleDelete($event, 4)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 5"
          :value="input5"
          @input="handleChange($event, 5)"
          @keyup.delete="handleDelete($event, 5)"
          maxlength="1"
          type="password"
        />
        <input
          v-if="index == 6"
          :value="input6"
          @input="handleChange($event, 6)"
          @keyup.delete="handleDelete($event, 6)"
          maxlength="1"
          type="password"
        />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
    },
    len: {
      type: Number,
    },
  },
  data() {
    return {
      inputRefGroup: null,
      input0: "",
      input1: "",
      input2: "",
      input3: "",
      input4: "",
      input5: "",
      input6: "",
    }
  },
  created() {
    this.password = String(this.value)
    this.password.split("").forEach((item, index) => {
      this[`input${index}`] = item
    })
  },
  mounted() {
    this.inputRefGroup = document.querySelectorAll("input")
    this.inputRefGroup[this.result.length].focus()
  },
  methods: {
    toFocus() {
      if (this.inputRefGroup[this.result.length]) {
        this.inputRefGroup[this.result.length].focus()
      }
    },
    handleChange(e, num) {
      this[`input${num}`] = e.target.value
      if (this.inputRefGroup[num + 1]) {
        this.inputRefGroup[num + 1].focus()
      } else {
        alert("当前输入的密码是:" + this.result)
      }
      this.$emit("input", this.result)
    },
    handleDelete(e, num) {
      this[`input${num - 1}`] = ""
      if (this.inputRefGroup[num - 1]) {
        this.inputRefGroup[num - 1].focus()
      }
      this.$emit("input", this.result)
    },
  },
  computed: {
    result() {
      return (
        this.input0 +
        this.input1 +
        this.input2 +
        this.input3 +
        this.input4 +
        this.input5 +
        this.input6
      )
    },
  },
}
</script>

<style>
.group {
  display: flex;
  align-items: center;
  justify-content: center;
}

.item input {
  text-align: center;
  font-size: 25px;
  width: 50px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 创建一个Vue组件库 首先,需要创建一个Vue组件库,并编写组件代码。可以使用Vue CLI来快速创建一个Vue项目: ``` vue create my-component-library ``` 在创建项目时,需要选择手动选择特性,并勾选Babel、Router、Vuex和CSS Pre-processors等选项,以便后续使用。 然后,在src目录下创建components目录,并编写组件代码。例如,创建一个HelloWorld组件: ```vue <template> <div>{{ message }}</div> </template> <script> export default { name: 'HelloWorld', props: { message: String } } </script> ``` 2. 配置打包命令 完成组件编写后,可以使用vue-cli-service进行打包。在package.json文件中添加以下命令: ```json "scripts": { "build": "vue-cli-service build --target lib --name my-component-library src/main.js" } ``` 其中,--target lib表示打包为一个库,--name my-component-library表示库的名称为my-component-library,src/main.js表示入口文件。 3. 配置package.json 在package.json文件中,需要添加以下配置: ```json { "name": "my-component-library", "version": "1.0.0", "description": "A Vue.js component library", "main": "dist/my-component-library.umd.js", "files": [ "dist/*", "src/components/*" ], "keywords": [ "vue", "component", "library" ], "author": "Your Name", "license": "MIT", "peerDependencies": { "vue": "^2.6.11" } } ``` 其中,name、description、keywords、author、license等字段需要根据实际情况进行修改。main字段指定了库的入口文件,files字段指定了需要发布的文件列表,peerDependencies字段指定了依赖的Vue版本。 4. 发布到npm 在npm官网注册并登录账号后,进入项目目录,执行以下命令发布: ``` npm login npm publish ``` 其中,npm login需要输入用户名、密码和邮箱,npm publish会将当前目录下的文件发布到npm仓库。 5. 使用组件库 其他项目可以使用npm install命令安装my-component-library: ``` npm install my-component-library ``` 然后,在需要使用的组件中引入组件库,并注册组件即可: ```js import Vue from 'vue' import MyComponentLibrary from 'my-component-library' Vue.use(MyComponentLibrary) // 或者 import HelloWorld from 'my-component-library/src/components/HelloWorld.vue' Vue.component('HelloWorld', HelloWorld) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白嫖leader

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值