DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕


目录


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)

📚前言

在全球 AI 市场,DeepSeek 凭借其创新的技术和独特的优势,迅速赢得了市场份额,打破了原有的市场格局。许多企业开始重新评估自身的 AI 战略,加大对 AI 技术的研发投入,以应对 DeepSeek 带来的竞争压力。同时,DeepSeek 的开源策略也促进了全球 AI 社区的发展,吸引了更多的开发者和企业参与到 AI 技术的创新和应用中,推动了全球 AI 市场的繁荣。

在大语言模型的发展浪潮中,DeepSeek 虽取得了显著成就,但也面临着诸多技术挑战。

算力需求是首要难题。随着模型规模的不断扩大,对算力的要求呈指数级增长。以 DeepSeek-V3 为例,其总参数达 6710 亿,如此庞大的模型在训练过程中需要消耗大量的计算资源。训练这样的大模型需要强大的计算集群支持,而构建和维护这样的计算集群不仅成本高昂,还面临着技术难题。算力瓶颈不仅限制了模型的训练速度和效率,也增加了研发成本和时间。在实际训练中,由于算力不足,可能会导致训练时间延长,无法及时迭代模型,从而影响产品的竞争力。

📚页面效果

📚指令输入

已经创建好了一个基于Vue3的组合式API的项目(Composition API),并能正常运行起来,请帮我用 Vue3的组合式API(Composition API) 生成一个 单选按钮(Radio Button) 的功能组件,所有代码都保存在components/RadioButton 下的文件夹中。功能组件的script标签中只有setup属性,使用普通 JavaScript 实现,不使用TypeScript。

功能要有,如下属性:

定义属性

1. 基础属性
  • value :用于绑定单选按钮的值,当单选按钮被选中时,该值会被传递出去。通常与父组件中的 v-model 配合使用,实现双向数据绑定。
  • label:显示在单选按钮旁边的文本标签,用于提示用户该单选按钮的含义。
2. 状态属性
  • checked:用于控制单选按钮是否被选中。可以是布尔值,也可以与某个值进行比较来确定是否选中。
  • disabled:布尔类型,用于禁用单选按钮,使其不可点击。
3. 样式属性
  • size :用于设置单选按钮的大小,例如 smallmediumlarge 等,方便统一调整组件的外观。
  • color:设置单选按钮的颜色,以满足不同的设计需求。
4. 分组属性
  • name :用于将多个单选按钮归为一组,同一组内的单选按钮只能有一个被选中。类似于原生 HTML 中 input[type="radio"]name 属性。

定义事件

1. 选中事件
  • change:当单选按钮的选中状态发生改变时触发,通常会传递当前选中的值给父组件,方便父组件进行相应的处理。
2. 点击事件
  • click:当用户点击单选按钮时触发,可用于一些额外的交互逻辑,如统计点击次数等。

其他

1. 兼容性
  • 确保组件在不同浏览器和设备上有良好的兼容性,特别是在处理焦点、键盘导航等方面。
2. 可访问性
  • 遵循可访问性标准,为单选按钮添加适当的 aria-labelaria-labelledby 属性,方便屏幕阅读器等辅助设备识别。
3. 样式定制
  • 提供一些 CSS 类名或插槽,方便用户自定义单选按钮的样式,以适应不同的设计风格。
4. 错误处理
  • 在组件内部对传入的属性进行验证,当传入无效属性时给出明确的错误提示,方便开发者调试。
5. 文档和示例
  • 编写详细的文档,说明组件的使用方法、属性和事件的含义,并提供一些示例代码,帮助其他开发者快速上手。

你有更好的建议也可以添加,要注明。组件定义好后给出5个及以上的调用示例。

下面是现有目录

vueAndDeepseek/

├── src/ # 源代码目录

│ ├── assets/ # 静态资源

│ │ ├── base.css

│ │ ├── main.css

│ │ └── logo.svg

│ ├── components/ # 组件目录

│ │ ├── HelloWorld.vue

│ │ ├── TheWelcome.vue

│ │ ├── WelcomeItem.vue

│ │ ├── Progress/

│ │ │ └── Progress.vue

│ │ ├── Accordion/

│ │ ├── BackToTop/

│ │ ├── Card/

│ │ ├── InfiniteScroll/

│ │ ├── Notification/

│ │ ├── Timeline/

│ │ ├── Switch/

│ │ ├── Tabs/

│ │ ├── Sidebar/

│ │ ├── Breadcrumbs/

│ │ ├── MasonryLayout/

│ │ ├── Rating/

│ │ ├── ColorPicker/

│ │ ├── RightClickMenu/

│ │ ├── RangePicker/

│ │ ├── Navbar/

│ │ ├── FormValidation/

│ │ ├── CopyToClipboard/

│ │ ├── ClickAnimations/

│ │ ├── ThumbnailList/

│ │ ├── KeyboardShortcuts/

│ │ ├── CommentSystem/

│ │ ├── QRCode/

│ │ ├── RadioButton/

│ │ ├── DatePicker/

│ │ └── icons/

│ ├── router/ # 路由配置

│ │ └── index.js

│ ├── stores/ # Pinia 状态管理

│ │ └── counter.js

│ ├── views/ # 页面组件

│ │ ├── ProgressView.vue

│ │ ├── TabsView.vue

│ │ ├── SwitchView.vue

│ │ ├── TimelineView.vue

│ │ ├── NotificationView.vue

│ │ ├── CardView.vue

│ │ ├── InfiniteScrollView.vue

│ │ ├── BackToTopView.vue

│ │ ├── AccordionView.vue

│ │ ├── SidebarView.vue

│ │ ├── BreadcrumbsView.vue

│ │ ├── MasonryLayoutView.vue

│ │ ├── RatingView.vue

│ │ ├── ColorPickerView.vue

│ │ ├── RightClickMenuView.vue

│ │ ├── RangePickerView.vue

│ │ ├── NavbarView.vue

│ │ ├── FormValidationView.vue

│ │ ├── CopyToClipboardView.vue

│ │ ├── ClickAnimationsView.vue

│ │ ├── ThumbnailListView.vue

│ │ ├── KeyboardShortcutsView.vue

│ │ ├── CommentSystemView.vue

│ │ ├── QRCodeView.vue

│ │ ├── RadioButtonView.vue

│ │ ├── DatePickerView.vue

│ │ └── AboutView.vue

│ ├── App.vue # 根组件

│ └── main.js # 应用入口

├── public/ # 公共资源目录

├── index.html # HTML 模板

├── package.json # 项目配置

├── vite.config.js # Vite 配置

└── node_modules/ # 依赖包目录

📚think

📘组件代码

根据你的需求,我帮你创建了 RadioButton 组件,以下是具体实现:

components/RadioButton/RadioButton.vue

html 复制代码
<template>
  <label 
    class="radio-container"
    :class="[
      `radio--${size}`,
      { 'is-disabled': disabled }
    ]"
  >
    <input
      type="radio"
      class="radio-input"
      :checked="isChecked"
      :disabled="disabled"
      :value="value"
      :name="name"
      @change="handleChange"
      @click="handleClick"
      :aria-label="ariaLabel"
    >
    <span 
      class="radio-checkmark"
      :style="checkmarkStyle"
    ></span>
    <span class="radio-label">{{ label }}</span>
  </label>
</template>

<script setup>
import { computed } from 'vue';

const props = defineProps({
  modelValue: { type: [String, Number, Boolean], required: true },
  value: { type: [String, Number, Boolean], required: true },
  label: { type: String, default: '' },
  checked: { type: Boolean, default: false },
  disabled: { type: Boolean, default: false },
  size: { 
    type: String, 
    default: 'medium',
    validator: (v) => ['small', 'medium', 'large'].includes(v) 
  },
  color: { type: String, default: '#3b82f6' },
  name: { type: String, default: '' },
  ariaLabel: { type: String, default: '' }
});

const emit = defineEmits(['update:modelValue', 'change', 'click']);

const isChecked = computed(() => 
  props.modelValue !== undefined 
    ? props.modelValue === props.value 
    : props.checked
);

const checkmarkStyle = computed(() => ({
  borderColor: props.color,
  backgroundColor: isChecked.value ? props.color : 'transparent'
}));

const handleChange = (e) => {
  if (props.disabled) return;
  emit('update:modelValue', props.value);
  emit('change', props.value);
};

const handleClick = (e) => {
  if (props.disabled) return;
  emit('click', e);
};
</script>

<style scoped>
.radio-container {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  user-select: none;
  margin-right: 16px;
}

.radio-input {
  position: absolute;
  opacity: 0;
  height: 0;
  width: 0;
}

.radio-checkmark {
  position: relative;
  display: inline-block;
  width: 18px;
  height: 18px;
  border: 2px solid #ccc;
  border-radius: 50%;
  margin-right: 8px;
  transition: all 0.2s ease;
}

.radio-checkmark::after {
  content: "";
  position: absolute;
  display: none;
  top: 3px;
  left: 3px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: white;
}

.radio-input:checked ~ .radio-checkmark::after {
  display: block;
}

.radio-input:focus-visible ~ .radio-checkmark {
  box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5);
}

/* 尺寸 */
.radio--small .radio-checkmark {
  width: 16px;
  height: 16px;
}
.radio--small .radio-checkmark::after {
  width: 6px;
  height: 6px;
}

.radio--large .radio-checkmark {
  width: 20px;
  height: 20px;
}
.radio--large .radio-checkmark::after {
  width: 10px;
  height: 10px;
}

/* 禁用状态 */
.is-disabled {
  opacity: 0.6;
  cursor: not-allowed;
}
</style>

以下是5个使用示例:

  1. 基础用法
html 复制代码
<template>
  <div>
    <RadioButton 
      v-model="selected" 
      value="apple" 
      label="苹果" 
    />
    <RadioButton
      v-model="selected"
      value="banana"
      label="香蕉"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import RadioButton from '@/components/RadioButton/RadioButton.vue';

const selected = ref('apple');
</script>
  1. 禁用状态
html 复制代码
<RadioButton
  v-model="selected"
  value="disabled"
  label="禁用选项"
  disabled
/>
  1. 自定义颜色和尺寸
html 复制代码
<RadioButton
  v-model="selected"
  value="custom"
  label="自定义样式"
  color="#ff4757"
  size="large"
/>
  1. 分组使用
html 复制代码
<template>
  <div>
    <h3>选择性别</h3>
    <RadioButton
      v-model="gender"
      value="male"
      label="男"
      name="gender"
    />
    <RadioButton
      v-model="gender"
      value="female"
      label="女"
      name="gender"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue';

const gender = ref('male');
</script>
  1. 事件处理
html 复制代码
<template>
  <RadioButton
    v-model="selected"
    value="event"
    label="带事件选项"
    @change="handleChange"
    @click="handleClick"
  />
</template>

<script setup>
const handleChange = (value) => {
  console.log('选中值变化:', value);
};

const handleClick = (event) => {
  console.log('点击事件:', event);
};
</script>

额外建议:

  1. 键盘导航支持:已通过原生 input 实现,支持 Space 键切换
  2. 焦点样式:使用 :focus-visible 伪类实现了可见焦点环
  3. 过渡动画:为 checkmark 添加了过渡动画提升体验
  4. 颜色对比度:自动生成的内圈白色确保与自定义颜色形成足够对比
  5. 响应式设计:使用 em 单位保证在不同字号下的显示一致性

组件特性:

  • 支持完全键盘操作
  • 自动处理 ARIA 属性
  • 支持按需样式覆盖
  • 内置基础尺寸规范
  • 通过原生 input 实现最佳兼容性
  • 自动处理浏览器默认样式覆盖

📚代码测试

正常

📚测试代码正常跑通,附其他基本代码

  • 添加路由
  • 页面展示入口

📘编写路由 src\router\index.js

javascript 复制代码
import { createRouter, createWebHistory } from 'vue-router'
import RightClickMenuView from '../views/RightClickMenuView.vue'
import RangePickerView from '../views/RangePickerView.vue'


const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'progress',
      component:  () => import('../views/ProgressView.vue'),
    },
    {
      path: '/tabs',
      name: 'tabs',
      // route level code-splitting
      // this generates a separate chunk (About.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      // 标签页(Tabs)
      component: () => import('../views/TabsView.vue'),
    },
    {
      path: '/accordion',
      name: 'accordion',
      // 折叠面板(Accordion)
      component: () => import('../views/AccordionView.vue'),
    },
    {
      path: '/timeline',
      name: 'timeline',
      // 时间线(Timeline)
      component: () => import('../views/TimelineView.vue'),
    },
    {
      path: '/backToTop',
      name: 'backToTop',
      component: () => import('../views/BackToTopView.vue')
    },
    {
      path: '/notification',
      name: 'notification',
      component: () => import('../views/NotificationView.vue')
    },
    {
      path: '/card',
      name: 'card',
      component: () => import('../views/CardView.vue')
    },
    {
      path: '/infiniteScroll',
      name: 'infiniteScroll',
      component: () => import('../views/InfiniteScrollView.vue')
    },
    {
      path: '/switch',
      name: 'switch',
      component: () => import('../views/SwitchView.vue')
    },
    {
      path: '/sidebar',
      name: 'sidebar',
      component: () => import('../views/SidebarView.vue')
    },
    {
      path: '/breadcrumbs',
      name: 'breadcrumbs',
      component: () => import('../views/BreadcrumbsView.vue')
    },
    {
      path: '/masonryLayout',
      name: 'masonryLayout',
      component: () => import('../views/MasonryLayoutView.vue')
    },
    {
      path: '/rating',
      name: 'rating',
      component: () => import('../views/RatingView.vue')
    },
    {
      path: '/datePicker',
      name: 'datePicker',
      component: () => import('../views/DatePickerView.vue')
    },
    {
      path: '/colorPicker',
      name: 'colorPicker',
      component: () => import('../views/ColorPickerView.vue')
    },
    {
      path: '/rightClickMenu',
      name: 'rightClickMenu',
      component: RightClickMenuView
    },
    {
      path: '/rangePicker',
      name: 'rangePicker',
      component: () => import('../views/RangePickerView.vue')
    },
    {
      path: '/navbar',
      name: 'navbar',
      component: () => import('../views/NavbarView.vue')
    },
    {
      path: '/formValidation',
      name: 'formValidation',
      component: () => import('../views/FormValidationView.vue')
    },
    {
      path: '/copyToClipboard',
      name: 'copyToClipboard',
      component: () => import('../views/CopyToClipboardView.vue')
    },
    {
      path: '/clickAnimations',
      name: 'clickAnimations',
      component: () => import('../views/ClickAnimationsView.vue')
    },
    {
      path: '/thumbnailList',
      name: 'thumbnailList',
      component: () => import('../views/ThumbnailListView.vue')
    },
    {
      path: '/keyboardShortcuts',
      name: 'keyboardShortcuts',
      component: () => import('../views/KeyboardShortcutsView.vue')
    },
    {
      path: '/commentSystem',
      name: 'commentSystem',
      component: () => import('../views/CommentSystemView.vue')
    },
    {
      path: '/qRCode',
      name: 'qRCode',
      component: () => import('../views/QRCodeView.vue')
    },
    {
      path: '/radioButton',
      name: 'radioButton',
      component: () => import('../views/RadioButtonView.vue')
    }
  ],
})

export default router

📘编写展示入口 src\App.vue

html 复制代码
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script>

<template>
  <header>
    <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />

    <div class="wrapper">
      <HelloWorld msg="You did it!" />
      <nav>
        <RouterLink to="/">Progress</RouterLink>
        <RouterLink to="/tabs">Tabs</RouterLink>
        <RouterLink to="/accordion">Accordion</RouterLink>
        <RouterLink to="/timeline">Timeline</RouterLink>
        <RouterLink to="/backToTop">BackToTop</RouterLink>
        <RouterLink to="/notification">Notification</RouterLink>
        <RouterLink to="/card">Card</RouterLink>
        <RouterLink to="/infiniteScroll">InfiniteScroll</RouterLink>
        <RouterLink to="/switch">Switch</RouterLink>
        <RouterLink to="/sidebar">Sidebar</RouterLink>
        <RouterLink to="/breadcrumbs">Breadcrumbs</RouterLink>
        <RouterLink to="/masonryLayout">MasonryLayout</RouterLink>
        <RouterLink to="/rating">Rating</RouterLink>
        <RouterLink to="/datePicker">DatePicker</RouterLink>
        <RouterLink to="/colorPicker">ColorPicker</RouterLink>
        <RouterLink to="/rightClickMenu">RightClickMenu</RouterLink>
        <RouterLink to="/rangePicker">RangePicker</RouterLink>
        <RouterLink to="/navbar">Navbar</RouterLink>
        <RouterLink to="/formValidation">FormValidation</RouterLink>
        <RouterLink to="/copyToClipboard">CopyToClipboard</RouterLink>
        <RouterLink to="/clickAnimations">ClickAnimations</RouterLink>
        <RouterLink to="/thumbnailList">ThumbnailList</RouterLink>
        <RouterLink to="/keyboardShortcuts">KeyboardShortcuts</RouterLink>
        <RouterLink to="/commentSystem">CommentSystem</RouterLink>
        <RouterLink to="/qRCode">QRCode</RouterLink>
        <RouterLink to="/radioButton">RadioButton</RouterLink>
      </nav>
    </div>
  </header>

  <RouterView />
</template>

<style scoped>
header {
  line-height: 1.5;
  max-height: 100vh;
}

.logo {
  display: block;
  margin: 0 auto 2rem;
}

nav {
  width: 100%;
  font-size: 12px;
  text-align: center;
  margin-top: 2rem;
}

nav a.router-link-exact-active {
  color: var(--color-text);
}

nav a.router-link-exact-active:hover {
  background-color: transparent;
}

nav a {
  display: inline-block;
  padding: 0 1rem;
  border-left: 1px solid var(--color-border);
}

nav a:first-of-type {
  border: 0;
}

@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }

  nav {
    text-align: left;
    margin-left: -1rem;
    font-size: 1rem;

    padding: 1rem 0;
    margin-top: 1rem;
  }
}
</style>

📚页面效果

📚相关文章

------------ 相 关 文 章 ------------

  1. 0基础3步部署自己的DeepSeek安装步骤

  2. DeepSeek 助力 Vue 开发:打造丝滑的步骤条(Step bar)https://blog.csdn.net/qq_33650655/article/details/145560497

  3. DeepSeek 助力 Vue 开发:打造丝滑的进度条(Progress Bar)https://blog.csdn.net/qq_33650655/article/details/145577034

  4. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)https://blog.csdn.net/qq_33650655/article/details/145587999

  5. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)https://blog.csdn.net/qq_33650655/article/details/145590404

  6. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的时间线(Timeline )https://blog.csdn.net/qq_33650655/article/details/145597372

  7. DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)https://blog.csdn.net/qq_33650655/article/details/145615550

  8. DeepSeek 助力 Vue 开发:打造丝滑的通知栏(Notification Bar)https://blog.csdn.net/qq_33650655/article/details/145620055

  9. DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)https://blog.csdn.net/qq_33650655/article/details/145634564

  10. DeepSeek 助力 Vue 开发:打造丝滑的无限滚动(Infinite Scroll)https://blog.csdn.net/qq_33650655/article/details/145638452

  11. DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)https://blog.csdn.net/qq_33650655/article/details/145644151

  12. DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)https://blog.csdn.net/qq_33650655/article/details/145654204

  13. DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)https://blog.csdn.net/qq_33650655/article/details/145656895

  14. DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)https://blog.csdn.net/qq_33650655/article/details/145663699

  15. DeepSeek 助力 Vue 开发:打造丝滑的评分组件(Rating)https://blog.csdn.net/qq_33650655/article/details/145664576

  16. DeepSeek 助力 Vue 开发:打造丝滑的日期选择器(Date Picker),未使用第三方插件 https://blog.csdn.net/qq_33650655/article/details/145673279

  17. DeepSeek 助力 Vue 开发:打造丝滑的颜色选择器(Color Picker)https://blog.csdn.net/qq_33650655/article/details/145689522

  18. DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)https://blog.csdn.net/qq_33650655/article/details/145706658

  19. DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)https://blog.csdn.net/qq_33650655/article/details/145713572

  20. DeepSeek 助力 Vue 开发:打造丝滑的导航栏(Navbar)https://blog.csdn.net/qq_33650655/article/details/145732421

  21. DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)https://blog.csdn.net/qq_33650655/article/details/145735582

  22. DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)https://blog.csdn.net/qq_33650655/article/details/145739569

  23. DeepSeek 助力 Vue 开发:打造丝滑的点击动画(Click Animations)https://blog.csdn.net/qq_33650655/article/details/145766184

  24. DeepSeek 助力 Vue 开发:打造丝滑的缩略图列表(Thumbnail List)https://blog.csdn.net/qq_33650655/article/details/145776679

  25. DeepSeek 助力 Vue 开发:打造丝滑的 键盘快捷键(Keyboard Shortcuts) https://blog.csdn.net/qq_33650655/article/details/145780227

  26. DeepSeek 助力 Vue 开发:打造丝滑的评论系统(Comment System)https://blog.csdn.net/qq_33650655/article/details/145781104

  27. DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)https://blog.csdn.net/qq_33650655/article/details/145797928

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。


更多专栏订阅推荐:

👍 html+css+js 绚丽效果

💕 vue

✈️ Electron

⭐️ js

📝 字符串

✍️ 时间对象(Date())操作

相关推荐
qq_333120972 分钟前
头歌答案--爬虫实战
java·前端·爬虫
Jinuss4 分钟前
源码分析之React中的组件缓存React.memo
前端·react.js
斯班奇的好朋友阿法法10 分钟前
ollama离线导入大模型
服务器·前端·javascript
misty youth16 分钟前
pnpm build,发生了什么
前端·electron·pnpm·build
1024小神16 分钟前
kotlin安卓项目配置webview开启定位功能
前端
踩着两条虫17 分钟前
VTJ.PRO 在线应用开发平台的术语表
vue.js·低代码·ai编程
踩着两条虫18 分钟前
VTJ.PRO 在线应用开发平台的构建与发布脚本
vue.js·ai编程·前端工程化
kyriewen24 分钟前
MutationObserver:DOM界的“卧底”,暗中观察每个风吹草动
前端·javascript·面试
踩着两条虫30 分钟前
VTJ.PRO 在线应用开发平台的开发者工具与代码质量
前端·vue.js·ai编程
TON_G-T38 分钟前
100行实现Mini React
前端·javascript·react.js