pokemonUI项目——switch组件

280 阅读1分钟

需求分析

switch组件仿照ant design来进行设计,实现类似手机设置中的开关按钮,点击按钮向右滑动。 如图所示 IMG_5404.jpg

API设计

<button class="pokemon-switch" @click="toggle" :class="{'pokemon-checked':value}">

用按钮来进行设计,给它添加一个类,当关闭时是灰色并且内侧白色小球在左侧,添加一个事件监听,当click的时候触发toggle事件,实现切换。当检测到切换时,会变成蓝色,内部白色小球滑动向右。

代码实现

写样式

首先初始化这个switch组件,用css画出它的样子。

截屏2022-09-19 13.54.16.png

截屏2022-09-19 13.54.46.png 再写一个切换后的样式

截屏2022-09-19 13.55.48.png 添加动画即可实现切换后的效果。

截屏2022-09-19 13.56.56.png

添加事件监听 点击时触发toggle事件,让控制是否切换的类进行true和false的切换。

setup(props, context) {
  const toggle = () => {
    context.emit('update:value', !props.value)
    //input 与SwitchDemo组件的input事件对应,!props.value与$event对应
  }
  return {toggle}
},

控制初始状态和更新以后的状态

在不使用v-model的情况下,如果要实现与外部组件互相通信,我们需要给出一个value属性以及input事件。 通过props接受外部组件的value值。再通过setup的两个参数,和context.emit(事件名, 事件参数)办法来操作。

外部
<template>
<Switch :value="status" @input="status=$event" />//$event为最新的值
</template>

<script lang='ts'>
export default {
  components: {Switch},
  setup() {
    const status = ref(false)
    return {status}
  }
</script>


内部

<template>
<button @click="toggle" :class="{checked:value}">
</template>

export default {

  props: {

    value: Boolean

  },

  setup(props,context) {

    const toggle = () => {

      context.emit('input',!props.value)

    //input 与SwitchDemo组件的input事件对应,!props.value与$event对应

    }

    return {toggle}

  }

}

在Vue3中尤雨溪规定,属性名可以任意,比如x,那么事件名必须是update:x,然后使用v-model

<Switch v-model:value="status"  /> //v-model等价于@update:value="status=$event"

v-model等价于@update:value="status=$event" 这样就可以通过v-model来进行组件通信了。