How to encapsulate timer components in Vue3

How to encapsulate timer components in Vue3

background

When you open the product details on some shopping mall web pages, there will be a counter to select the purchase quantity. Such a timer will not only be displayed on the product details page but also in the shopping cart. Then the timer can be encapsulated into a component for better reuse and later maintenance.

Landing code

<template>
  <div class="xtx-numbox">
    <div class="label"><slot /></div>
    <div class="numbox">
      <a href="javascript:;" @click="handleSub(-1)">-</a>
      <input type="text" readonly :value="num" />
      <a href="javascript:;" @click="handleSub(1)">+</a>
    </div>
  </div>
</template>
<script>
// Third-party method useVModel to implement two-way binding import { useVModel } from '@vueuse/core'
export default {
  name: 'XtxNumbox',
  props: {
    modelValue: {
      type: Number,
      default: 1
    }
  },
  setup(props, { emit }) {
    //The useVModel method receives three parameters,
    // Parameter 1: custom property props receives data passed by the parent component through v-model two-way binding // Parameter 2: data to be passed in props // Parameter 3: emit bound data needs to notify the parent component through the emit event const num = useVModel(props, 'modelValue', emit)
    const handleSub = n => {
      if (n < 0) {
        num.value -= 1
        if (props.modelValue === 1) {
          num.value = 1
        }
      } else {
        num.value += 1
      }
    }
    return { handleSub, num }
  }
}
</script>
<style scoped lang="less">
.xtx-numbox {
  display: flex;
  align-items: center;
  .label {
    width: 60px;
    color: #999;
    padding-left: 10px;
  }
  .numbox {
    width: 120px;
    height: 30px;
    border: 1px solid #e4e4e4;
    display: flex;
    > a {
      width: 29px;
      line-height: 28px;
      text-align: center;
      background: #f8f8f8;
      font-size: 16px;
      color: #666;
      &:first-of-type {
        border-right: 1px solid #e4e4e4;
      }
      &:last-of-type {
        border-left: 1px solid #e4e4e4;
      }
    }
    > input {
      width: 60px;
      padding: 0 5px;
      text-align: center;
      color: #666;
    }
  }
}
</style>

use

<XtxNumbox v-model="num">Quantity</XtxNumbox>

Effect

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • Implementing a simple timer based on Vue method
  • Vue-cli framework implements timer application
  • Using Vue to implement timer function
  • Vue.js implements simple timer function
  • Vue implements a simple timer component
  • How to implement Vue timer
  • Detailed usage of Vue timer
  • Solve the problem of timer continuing to execute after Vue component is destroyed
  • Vue example code using timer to achieve marquee effect
  • Implementation code of vue timer component

<<:  MySQL learning tutorial clustered index

>>:  Detailed explanation of the execution differences between count(1), count(*) and count(column name)

Recommend

MySQL merge and split by specified characters example tutorial

Preface Merging or splitting by specified charact...

Summary of Vue 3 custom directive development

What is a directive? Both Angular and Vue have th...

Summary of Nginx location and proxy_pass path configuration issues

Table of contents 1. Basic configuration of Nginx...

mysql solves time zone related problems

Preface: When using MySQL, you may encounter time...

How to uninstall Linux's native openjdk and install sun jdk

See: https://www.jb51.net/article/112612.htm Chec...

Detailed explanation of the core concepts and basic usage of Vuex

Table of contents introduce start Install ① Direc...

Priority analysis of and or queries in MySQL

This may be an issue that is easily overlooked. F...

React realizes secondary linkage effect (staircase effect)

This article shares the specific code of React to...

Solve the problem of running jupyter notebook on the server

Table of contents The server runs jupyter noteboo...

Summary of various postures of MySQL privilege escalation

Table of contents 1. Write Webshell into outfile ...

Implementation of postcss-pxtorem mobile adaptation

Execute the command to install the plugin postcss...