首页 > 其他分享 >使用 Js 纯手写实现组件

使用 Js 纯手写实现组件

时间:2024-04-10 17:45:54浏览次数:16  
标签:vue const name text Js 组件 手写 ele JSImplementedView

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

标签:vue,const,name,text,Js,组件,手写,ele,JSImplementedView
From: https://www.cnblogs.com/dongling/p/18126523

相关文章

  • 牛蛙!GoFrame2.7正式版的监控组件真是及时雨
    声明:本文首发在同名公众号:王中阳Go,未经授权禁止转载。......
  • UE中创建Actor添加组件初始化(UEC++个人学习笔记)
    在ue中创建actorc++类,在actor的.h文件中添加五个组件又由上到下的作用分别为:获取下SceneComponent,用于操作其Transform等相应接口。获取静态模型组件。获取盒子碰撞组件。获取粒子特效组件。获取音频组件。#include"Components/SceneComponent.h"#include"Components......
  • 鸿蒙HarmonyOS实战-ArkUI组件(Popup)
    ......
  • H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答
    EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。今天我们来汇总下用户常见的几个问题及解答。1、EasyPlayer.js播放多路H.265视频时,CPU直接被占满该如何处理?答:因为H.265解码比较占......
  • C++_STL提供了六大组件
    STL提供了六大组件StandardTemplateLibrary容器:Containers各种数据结构,如vector,list,deque,set,mep等。容器是类模板。在声明容器变量时,可以指定容器将保存的元素的类型算法:各种常用的算法,提供了执行各种操作的方式,包括对容器内容执行初始化,排序,搜索和转换等操作,比如sort,s......
  • nodejs + ts + nodemon + webpack 代码热更新
    依赖:npminodemonwebpackwebpack-clits-loadertypescript//webpack.config.jsimport{defaultaswebpack}from"webpack";importnodeExternalsfrom"webpack-node-externals";constplugins=[newCleanWebpackPlugin({dangero......
  • react组件之cmao-ui,编写流程图的功能介绍
    流程组件介绍:该组件参考老版力软learun框架中的jquery流程组件进行重构,改写为react的组件。样式、操作、交互方式大致相近。该组件依赖的react版本大于18(不是不能做到兼容旧版react,而是要写就写新版本的,还用老的干嘛)下载//npm下载npminstallcmao-ui引用该组件是......
  • 5分钟学会Rust语言如何操作JSON
    JSON(JavaScriptObjectNotation)在Web开发中被广泛应用于数据交换。作为一种数据格式,JSON相较于XML来说,更易于阅读和写入,且数据解析性能强。Rust作为一门系统级编程语言,其与JSON的交互操作密切。本文将详细地描述在Rust中如何操作JSON,包括序列化、反序列化、JSON创建等多个......
  • momentJS时间相加 eg: 2024-12-12 12:30:12 + 50 = ?
    watch(()=>props.record,()=>{ if(props?.record){ letrecordData=props?.record console.log('output->recordData',recordData) //2-待反馈 if(recordData.status===2){ deadline.value=moment( moment(recordData.cr......
  • 1. 什么是three.js?
    Three.js是一个基于JavaScript编写的开源3D图形库,它使用WebGL技术在网页上渲染3D图形。Three.js提供了许多高级功能,如几何体、纹理、光照、阴影等,以便开发者能够快速地创建复杂且逼真的3D场景。 特点:Three.js具有跨平台性,可以在主要的桌面和移动浏览器上运行,并且其开源社区提......