vue或者uniapp有哪些API可以达到原生JS动态绑定css样式的效果?

原生JS中的一个业务逻辑如下:
点击li列表,对应的卡牌翻转过来,即:
每个li绑定一个点击事件,然后翻转

需求:让这段逻辑在vue或者uniapp项目中实现

创建一个名为Card的组件,用于表示每个卡片:

<template>
  <div class="card" :class="{ flipped: isFlipped }" @click="flipCard">
    <div class="front">正面</div>
    <div class="back">背面</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isFlipped: false, // 卡片是否翻转
    };
  },
  methods: {
    flipCard() {
      this.isFlipped = !this.isFlipped;
    },
  },
};
</script>

<style scoped>
.card {
  width: 100px;
  height: 150px;
  perspective: 800px;
}

.card.flipped .front {
  transform: rotateY(180deg);
}

.card .front,
.card .back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
  transition: transform 0.6s;
}

.card .front {
  background-color: #ccc;
}

.card .back {
  background-color: #f00;
  transform: rotateY(180deg);
}
</style>

在父组件中使用Card组件,并循环生成多个卡片:

<template>
  <div>
    <Card v-for="index in cardCount" :key="index" />
  </div>
</template>

<script>
import Card from "@/components/Card.vue";

export default {
  components: {
    Card,
  },
  data() {
    return {
      cardCount: 5, // 卡片数量
    };
  },
};
</script>

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7685363
  • 这篇博客你也可以参考下:vue中全局、局部引入js文件【vue】、【uniapp】
  • 除此之外, 这篇博客: vue.js、uniapp两种封装接口请求方法中的 前言:分别有两种封装方法适用于vue.js和uniapp;第一种:全局注册,通过this调用,不需要import引入js文件。第二种:需要请求接口的页面还要import一下。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    ps:下面代码示例是uniapp项目
    

    目录结构

    在这里插入图片描述


  • 以下回答来自chatgpt:

    在Vue或Uniapp项目中,可以使用以下API实现类似原生JS动态绑定CSS样式的效果:

    1. 使用v-bind指令动态绑定class属性:在模板中使用v-bind指令将样式类绑定到元素上。
    <template>
      <div :class="[isFlipped ? 'flipped' : '']" @click="flipCard"></div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isFlipped: false
        };
      },
      methods: {
        flipCard() {
          this.isFlipped = !this.isFlipped;
        }
      }
    };
    </script>
    
    <style>
    .flipped {
      transform: rotateY(180deg);
    }
    </style>
    
    1. 使用计算属性动态绑定class属性:通过计算属性根据条件返回不同的样式类。
    <template>
      <div :class="cardClass" @click="flipCard"></div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isFlipped: false
        };
      },
      computed: {
        cardClass() {
          return this.isFlipped ? 'flipped' : '';
        }
      },
      methods: {
        flipCard() {
          this.isFlipped = !this.isFlipped;
        }
      }
    };
    </script>
    
    <style>
    .flipped {
      transform: rotateY(180deg);
    }
    </style>
    
    1. 使用动态绑定style属性:通过在模板中使用v-bind指令动态绑定样式对象。
    <template>
      <div :style="cardStyle" @click="flipCard"></div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isFlipped: false
        };
      },
      computed: {
        cardStyle() {
          return {
            transform: this.isFlipped ? 'rotateY(180deg)' : ''
          };
        }
      },
      methods: {
        flipCard() {
          this.isFlipped = !this.isFlipped;
        }
      }
    };
    </script>
    

    以上是在Vue或Uniapp项目中实现类似原生JS动态绑定CSS样式的常用方法。根据具体需求和场景,可以选择适合的方法进行实现。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在Vue或Uniapp项目中实现点击li列表后对应的卡牌翻转可以按照以下步骤进行:
1,创建一个Vue组件,命名为Card,用于表示每张卡牌。

<template>
  <div class="card" :class="{ flipped: flipped }" @click="flipCard">
    <div class="card-front">正面</div>
    <div class="card-back">背面</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      flipped: false
    };
  },
  methods: {
    flipCard() {
      this.flipped = !this.flipped;
    }
  }
};
</script>

<style>
.card {
  width: 200px;
  height: 300px;
  perspective: 1000px;
  position: relative;
  transition: transform 0.6s;
}

.card.flipped {
  transform: rotateY(180deg);
}

.card-front,
.card-back {
  width: 100%;
  height: 100%;
  position: absolute;
  backface-visibility: hidden;
}

.card-front {
  background-color: #f0f0f0;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 24px;
}

.card-back {
  background-color: #c0c0c0;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 24px;
  transform: rotateY(180deg);
}
</style>


2,在父组件中使用Card组件,并为每个li绑定点击事件。

<template>
  <div>
    <ul>
      <li v-for="(item, index) in items" :key="index" @click="flipCard(index)">
        <Card />
      </li>
    </ul>
  </div>
</template>

<script>
import Card from "@/components/Card.vue";

export default {
  components: {
    Card
  },
  data() {
    return {
      items: [1, 2, 3, 4, 5] // 假设有5个卡牌
    };
  },
  methods: {
    flipCard(index) {
      // 根据索引来翻转对应的卡牌
      this.$set(this.items, index, !this.items[index]);
    }
  }
};
</script>


在以上示例中,每个li元素通过v-for循环生成,并为每个li元素绑定了一个点击事件。点击li元素时,调用flipCard方法来翻转对应卡牌的状态,通过Vue的响应式能力实现视图的更新,从而实现卡牌的翻转效果。