惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
博客园_首页
宝玉的分享
宝玉的分享
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
T
Tailwind CSS Blog
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
罗磊的独立博客
F
Fortinet All Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
D
DataBreaches.Net
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Scott Helme
Scott Helme
B
Blog
M
MIT News - Artificial intelligence
K
Kaspersky official blog
H
Help Net Security
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】
L
Lohrmann on Cybersecurity
P
Privacy & Cybersecurity Law Blog
Project Zero
Project Zero
The Hacker News
The Hacker News
B
Blog RSS Feed
T
Tor Project blog

博客园 - HorseShoe2016

Ethereum 学习笔记 ---- Solidity 数据位置(Calldata, Memory, Storage)编码与布局全解析 vscode 禁用警告提示音 浏览器加载 HTML 页面并执行 Javascript 的流程图 Ethereum学习笔记 ---- 多重继承中的 C3线性化算法 Ethereum学习笔记 ---- 使用 Remix 调试功能理解 bytes 在 memory 中的布局 Ethereum学习笔记 ---- 通过 Event 学习《合约ABI规范》 Javascript: Blob, File/FileReader, ArrayBuffer, ReadableStream, Response 转换方法 vscode 无法调试 golang testify suite 中的单个 test 的解决办法 一个简单的 indexedDB 应用示例 html 元素的 onEvent 与 addEventListener vue3 defineComponent: 使用纯 Javascript 定义组件 vue3 动态编译组件失败:Component provided template option but runtime compilation is not supported in this build of Vue Javascript Object 中,isExtensible/isSealed/isFrozen 的对比 mini-vue: 响应式数据的实现 手写Promise vscode vue 插件与 emmet、tailwind css 插件冲突的解决方案 Python 安装依赖包,出现 ssl.SSLCertVerificationError 的问题,解决方法 CentOS7 源码编译安装 Python 3.8.10,开启 SSL 功能 Protocol Buffer Go (proto3) - macos 搭建 protocol buffer 环境 + Encoding 实验
纯js实现 vue 组件 与 vue 单文件组件对比
HorseShoe2016 · 2024-04-10 · via 博客园 - HorseShoe2016

vue 的单文件组件,其实最终是编译成了一个 object,然后调用该 object 上的 setup() 函数来渲染页面的;
如下两个页面,一个使用 vue 单文件组件的语法来实现,一个使用纯 js 来实现,二者效果一致


使用 vue 实现组件

src/views/VueImplementedView.vue

<template>
  <div>
    <h1 class="text-blue-500 text-lg text-center">{{ name }}</h1>
    <ul
      class="text-center space-y-1 border-2 border-green-200 p-2 rounded-lg"
      @dragstart="dragToggle"
      @dragend="dragToggle"
    >
      <li
        v-for="i in 10"
        :key="i"
        class="border-2 border-red-200 rounded-full bg-cyan-200"
        draggable="true"
      >
        item-{{ i }}
      </li>
    </ul>
  </div>
</template>

<script setup>
import { defineProps } from 'vue'
defineProps({
  name: {
    type: String,
    default: 'This is VueImplementedView'
  }
})

function dragToggle(event) {
  const ele = event.target
  ele.classList.toggle('text-red-500')
  ele.classList.toggle('text-4xl')
  ele.classList.toggle('font-bold')
}
</script>

使用 js 实现组件

src/views/JSImplementedView.js

import { h } from 'vue'

const component = {
  setup(props) {
    function dragToggle(event) {
      const ele = event.target
      ele.classList.toggle('text-red-500')
      ele.classList.toggle('text-4xl')
      ele.classList.toggle('font-bold')
    }
    const render = () => {
      const list = []
      for (let i = 0; i < 10; i++) {
        list.push(
          h(
            'li',
            {
              class: 'border-2 border-red-200 rounded-full bg-cyan-200',
              key: i,
              draggable: true
            },
            `item-${i}`
          )
        )
      }
      const ul = h(
        'ul',
        {
          class: 'text-center space-y-1 border-2 border-green-200 p-2 rounded-lg',
          onDragstart: dragToggle,
          onDragend: dragToggle
        },
        list
      )
      const h1 = h('h1', { class: 'text-blue-500 text-lg text-center' }, `${props.name}`)
      return h('div', [h1, ul])
    }
    return render
  },
  props: {
    name: {
      type: String,
      default: 'This is a JSImplementedView'
    }
  }
}

export default component

在 router 中引用这两个组件

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import JSImplementedView from '@/views/JSImplementedView.js'
import VueImplementedView from '@/views/VueImplementedView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/js-implemented-view',
      name: 'JSImplementedView',
      component: JSImplementedView,
      props: {
        name: 'Hello, this is JSImplementedView'
      }
    },
    {
      path: '/vue-implemented-view',
      name: 'VueImplementedView',
      component: VueImplementedView,
      props: {
        name: 'Hello, this is VueImplementedView'
      }
    }
  ]
})

export default router

效果

二者效果一致:


这里可以观察到: v-for="i in 10"i 的起始值是 1 而不是 0

posted on 2024-04-10 17:34  HorseShoe2016  阅读(107)  评论()    收藏  举报