探索 Vue.js 的动态样式与交互:一个有趣的样式调整应用

news2025/1/8 15:11:03
修改日期备注
2025.1.3初版

一、前言

今天和大家分享在 Vue.js 学习过程中开发的超酷的小应用。这个应用可以让我们通过一些简单的交互元素,如复选框、下拉菜单和输入框,来动态地改变页面上元素的样式哦 让我们一起深入了解一下这个项目的实现过程,以及 Vue.js 在其中展现出的强大功能吧。

二、项目概览

我们先来看一下这个项目的整体结构,它由一个 HTML 文件和一个 JavaScript 文件组成,还搭配了一个简单的 CSS 文件来美化页面。

三、HTML 部分

以下是 HTML 文件的代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./style.css" />
    <script src="https://unpkg.com/vue@latest"></script>
  </head>
  <body>
    <div id="app">
      <label> <input type="checkbox" v-model="isPurple"/> Purple </label>

      <select v-model="textColor">
        <option value="">White</option>
        <option value="text-black">Black</option>
        <option value="text-orange">Orange</option>
      </select>

      <label>
        Circle Size
        <input type="number" v-model="size"/>
      </label>

      <label>
        Circle Rotate
        <input type="number" v-model="angle"/>
      </label>
      <div class="circle" :class="[circleClass, textColor]" :style="[circleSize, circleRotate]">Hi!</div>
    </div>

    <script src="./main.js"></script>
  </body>
</html>

在这个 HTML 文件中,有几个关键部分:

1. 输入元素

  • 我们有一个复选框:

    <label> <input type="checkbox" v-model="isPurple"/> Purple </label>
    

    这里使用了 v-model="isPurple",这个 v-model 指令可太重要啦!它将复选框的选中状态和 Vue 实例中的 isPurple 属性进行了双向绑定。这意味着,当我们勾选或取消勾选这个复选框时,isPurple 的值会相应地变成 truefalse

  • 还有一个下拉菜单:

    <select v-model="textColor">
      <option value="">White</option>
      <option value="text-black">Black</option>
      <option value="text-orange">Orange</option>
    </select>
    

    这个下拉菜单通过 v-model="textColor" 与 Vue 实例中的 textColor 属性进行双向绑定。当我们选择不同的选项时,textColor 的值就会变成相应的选项值,比如 “text-black” 或 “text-orange”。

  • 以及两个输入框:

    <label>
      Circle Size
      <input type="number" v-model="size"/>
    </label>
    <label>
      Circle Rotate
      <input type="number" v-model="angle"/>
    </label>
    

    这两个输入框分别与 sizeangle 属性进行双向绑定,当我们输入数字时,这些数字会存储在对应的属性中。它们都使用了 v-model 指令,这是 Vue.js 中实现双向数据绑定的神器哦,能让用户输入直接影响到 Vue 实例的数据。

2. 样式绑定元素

<div class="circle" :class="[circleClass, textColor]" :style="[circleSize, circleRotate]">Hi!</div>

这里是最有意思的部分啦 我们有一个 div 元素,它有一个静态的类 circle,同时使用了 :class:style 来动态绑定类和样式。

  • :class="[circleClass, textColor]"

    • circleClass 是一个计算属性,它会根据 isPurple 的值添加一个 purple 类。
    • textColor 是用户从下拉菜单中选择的值,会被作为类添加到这个 div 元素上。这样,我们可以通过用户的操作来动态改变元素的类,从而改变元素的颜色哦。
  • :style="[circleSize, circleRotate]"

    • circleSizecircleRotate 是另外两个计算属性,它们会根据用户输入的 sizeangle 来改变元素的大小和旋转角度。是不是很神奇呢?

    image-20250103182000322

四、JavaScript 部分

这是 main.js 的代码:

const app = {
  data() {
    return {
      isPurple: false,
      textColor: "",
      size: 200,
      angle: 0,
    };
  },

  computed: {
    circleClass() {
      return {
        purple: this.isPurple,
      };
    },

    circleSize() {
      return {
        height: `${this.size || 100}px`,
        width: `${this.size || 100}px`,
        lineHeight: `${this.size || 100}px`,
      };
    },

    circleRotate() {
      return {
        transform: `rotate(${this.angle || 0}deg)`,
      };
    },
  },
};

Vue.createApp(app).mount("#app");

让我们来拆解一下:

1. 数据部分(data)

data() {
  return {
    isPurple: false,
    textColor: "",
    size: 200,
    angle: 0,
  };
}

这里定义了几个初始数据属性,isPurple 用于存储复选框的状态,textColor 存储文本颜色的选项值,size 存储圆形的大小,angle 存储旋转的角度。

2. 计算属性(computed)

  • circleClass()

    circleClass() {
      return {
        purple: this.isPurple,
      };
    }
    

    这个计算属性会根据 isPurple 的值返回一个对象,如果 isPurpletrue,就会添加 purple 类。这样,我们就可以通过复选框的操作来改变元素的样式啦。

  • circleSize()

    circleSize() {
      return {
        height: `${this.size || 100}px`,
        width: `${this.size || 100}px`,
        lineHeight: `${this.size || 100}px`,
      };
    }
    

    这个计算属性会根据 size 的值生成一个对象,包含 heightwidthlineHeight 的样式。这里还有个小技巧哦,使用 || 100 是为了防止 size 为空时出现样式异常,确保元素至少有一个初始大小。

  • circleRotate()

    circleRotate() {
      return {
        transform: `rotate(${this.angle || 0}deg)`,
      };
    }
    

    同样,这个计算属性根据 angle 生成一个包含 transform 属性的对象,用于旋转元素。这里也使用了 || 0 来避免 angle 为空时的问题。

五、CSS 部分

我们还有一个 style.css 文件,来看看它的代码:

.circle {
  background-color: purple;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: all 0.5s;
}
.purple {
  background-color: purple;
}
.text-black {
  color: black;
}
.text-orange {
  color: orange;
}
  • .circle 类给我们的元素一个圆形的形状(通过 border-radius: 50%),还设置了背景色、布局和过渡效果。
  • .purple 类在元素添加了 purple 类时会生效,改变背景颜色。
  • .text-black.text-orange 类会根据用户选择的文本颜色改变元素的文本颜色。
  • image-20250103181937887

六、总结

通过这个项目,我们学到了好多 Vue.js 的重要知识呢 以下是一些值得注意的要点:

1. 双向数据绑定(v-model)

  • v-model 让我们可以轻松地将用户输入和 Vue 实例中的数据关联起来,让数据在用户操作和 Vue 实例之间自由流动,大大简化了数据更新的流程。无论是复选框、下拉菜单还是输入框,使用 v-model 都让我们的开发变得轻松愉快。

2. 计算属性(computed)

  • 计算属性真是个好帮手!它可以根据数据的变化自动计算出新的值,让我们能动态地生成类和样式对象。比如 circleClass 根据 isPurple 决定是否添加 purple 类,circleSizecircleRotate 根据用户输入生成样式,让我们的元素可以实时更新样式。

3. 动态样式绑定(:class 和 :style)

  • 通过 :class:style,我们可以根据计算属性和用户选择动态地添加类和样式,为元素赋予了更多的交互性和动态性。这让我们的页面变得更加生动,而且代码也更简洁明了哦。

七、后续改进和扩展

当然啦,这个小应用还有很多可以改进和扩展的地方呢 我们可以:

  • 增加更多的样式选项,比如边框、阴影等,让用户可以更自由地定制元素的外观。
  • 可以添加更多的交互元素,例如添加一个按钮,让用户可以重置所有设置。
  • 把这个应用变成一个组件,这样可以在其他 Vue 项目中更方便地复用哦。

怎么样,是不是觉得 Vue.js 很有趣呢 希望你也能动手尝试一下,创建出属于自己的动态样式应用。如果你在开发过程中遇到什么问题,或者有什么新的想法,欢迎在评论区留言,让我们一起学习和进步吧 期待看到大家创造出更多精彩的 Vue.js 应用哦

八、注意事项

在使用这个应用时,要注意以下几点哦:

  • 确保你的文件引用路径正确,比如 style.cssmain.js 要和 HTML 文件在同一目录,不然可能会出现文件加载错误。
  • 要正确使用 v-model 指令,确保绑定的属性在 data 中已经定义。
  • 对于计算属性,要注意它们的计算逻辑,确保能正确地生成你想要的结果。

好啦,今天的分享就到这里啦 希望这篇博客能帮助你更好地理解 Vue.js 的这些特性,让我们一起在 Vue.js 的世界里继续探索吧!

**

在使用这个应用时,要注意以下几点哦:

  • 确保你的文件引用路径正确,比如 style.cssmain.js 要和 HTML 文件在同一目录,不然可能会出现文件加载错误。
  • 要正确使用 v-model 指令,确保绑定的属性在 data 中已经定义。
  • 对于计算属性,要注意它们的计算逻辑,确保能正确地生成你想要的结果。

好啦,今天的分享就到这里啦 希望这篇博客能帮助你更好地理解 Vue.js 的这些特性,让我们一起在 Vue.js 的世界里继续探索吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; H…

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件&#xff0c;第三方通过npm依赖安装使用&#xff1b;使用最近公司接了一个项目&#xff0c;这个项目需要集成到第三方页面&#xff0c;在第三方页面点击项目名称&#xff0c;页面变成我们的项目页面&#xff1b;要求以npm库文件提供给他们&#xff1b;…

Kafka为什么要放弃Zookeeper

1.Kafka简介 Apache Kafka最早是由Linkedin公司开发&#xff0c;后来捐献给了Apack基金会。 Kafka被官方定义为分布式流式处理平台&#xff0c;因为具备高吞吐、可持久化、可水平扩展等特性而被广泛使用。目前Kafka具体如下功能&#xff1a; 消息队列,Kafka具有系统解耦、流…

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…

java 转义 反斜杠 Unexpected internal error near index 1

代码&#xff1a; String str"a\\c"; //出现异常&#xff0c;Unexpected internal error near index 1 //System.out.println(str.replaceAll("\\", "c"));//以下三种都正确 System.out.println(str.replace(\\, c)); System.out.println(str.r…

el-table 实现纵向多级表头

为了实现上图效果&#xff0c;最开始打算用el-row、el-col去实现&#xff0c;但发现把表头和数据分成两大列时&#xff0c;数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样&#xff0c;为保持高度样式一致&#xff0c;就需要我们手动去获取最高格的高度之后再设置…

2025最新版Visual Studio Code安装使用指南

2025最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML 2025-1-7 1. Visual Studio Code背景 早在二十年前&#xff0c;通用的集成开发环境&#xff08;Integrated Deveopment Environment, 简称…

Flutter 鸿蒙化 flutter和鸿蒙next混和渲染

前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段&#xff0c;每个阶段的重点内容逐步加深&#xff0c;帮助你从入门到精通。以下是一个简洁的学习过程&#xff1a; ​ 1. 基础入门阶段 理解图形化编程&#xff1a;LabVIEW是一种图形化编程语言&#xff0c;与传统的文本编程语言不同&am…

Kubernetes Gateway API-4-TCPRoute和GRPCRoute

1 TCPRoute 目前 TCP routing 还处于实验阶段。 Gateway API 被设计为与多个协议一起工作&#xff0c;TCPRoute 就是这样一个允许管理TCP流量的路由。 在这个例子中&#xff0c;我们有一个 Gateway 资源和两个 TCPRoute 资源&#xff0c;它们按照以下规则分配流量&#xff1…

嵌入式SD/TF卡通用协议-SDIO协议

SD卡&#xff08;SecureDigital MemoryCard&#xff09;即&#xff1a;安全数码卡&#xff0c;它是在MMC的基础上发展而来&#xff0c;是一种基于半导体快闪记忆器的新一代记忆设备&#xff0c;它被广泛地于便携式装置上使用&#xff0c;例如数码相机、个人数码助理(PDA)和多媒…

性能测试05|JMeter:分布式、报告、并发数计算、性能监控

目录 一、JMeter分布式 1、应用场景 2、原理 3、分布式相关注意事项 4、分布式配置与运行 二、JMeter报告 1、聚合报告 2、HTML报告 三、并发用户数&#xff08;线程数&#xff09;计算 四、JMeter下载第三方插件 五、性能监控 1、Concurrency Thread Group 线程组…

wujie无界微前端框架初使用

先说一下项目需求&#xff1a;将单独的四套系统的登录操作统一放在一个入口页面进行登录&#xff0c;所有系统都使用的是vue3&#xff0c;&#xff08;不要问我为啥会这样设计&#xff0c;产品说的客户要求&#xff09; 1.主系统下载wujie 我全套都是vue3&#xff0c;所以直接…

SpringIOC循环依赖与三级缓存

SpringIOC循环依赖与三级缓存 Spring解决循环依赖的核心机制就是通过三级缓存&#xff1a; 一级缓存&#xff08;singletonObjects&#xff09;&#xff1a;存储完全初始化好的Bean&#xff1b;二级缓存&#xff08;earlySingletonObjects&#xff09;&#xff1a;存储原始实例…

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现

目录 1 三种多头编码&#xff08;MHE&#xff09;实现1.1 多头乘积&#xff08;MHP&#xff09;1.2 多头级联&#xff08;MHC&#xff09;1.3 多头采样&#xff08;MHS&#xff09;1.4 标签分解策略 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者…

前端 图片上鼠标画矩形框,标注文字,任意删除

效果&#xff1a; 页面描述&#xff1a; 对给定的几张图片&#xff0c;每张能用鼠标在图上画框&#xff0c;标注相关文字&#xff0c;框的颜色和文字内容能自定义改变&#xff0c;能删除任意画过的框。 实现思路&#xff1a; 1、对给定的这几张图片&#xff0c;用分页器绑定…

【办公利器】ReNamer (批量文件重命名工具) Pro v7.6.0.4 多语便携版,海量文件秒速精准改名!

ReNamer是一款功能强大的文件重命名工具&#xff0c;它可以帮助用户快速方便地批量重命名文件和文件夹。 软件功能 批量重命名&#xff1a;ReNamer可以同时处理多个文件和文件夹&#xff0c;并对其进行批量重命名&#xff0c;从而节省时间和劳动力。灵活的重命名规则&#xff…

unity学习13:gameobject的组件component以及tag, layer 归类

目录 1 gameobject component 是unity的基础 1.1 类比 1.2 为什么要这么设计&#xff1f; 2 从空物体开始 2.1 创建2个物体 2.2 给 empty gameobject添加组件 3 各种组件和新建组件 3.1 点击 add component可以添加各种组件 3.2 新建组件 3.3 组件的操作 3.4 特别的…

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…

CSS——1.优缺点

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css&#xff1a;层叠样式表…