vue3+ts:render极简demo -- 引入element ui el-input组件

简介: vue3+ts:render极简demo -- 引入element ui el-input组件

一、示例一:

父组件:

<template>
  <div class="home">
    <render-input
      :msg="title"
      @updateMsg="updateMsg"
    >
    </render-input>
  </div>
</template>
<script lang="ts">
import { Options, Vue } from 'vue-class-component';
import renderInput from './components/render-components2.vue';
@Options({
  components: {
    renderInput,
  },
})
export default class Home extends Vue {
  public title = 'title'
  public updateMsg(val:any){
    console.log('23um', val)
    this.title = val
  }
}
</script>

子组件:

<script lang="ts">
import { ElInput } from "element-plus";
import { defineComponent, h, watch } from "vue";
export default defineComponent({
  props: {
    msg: {
      type: String,
      default: '',
    },
  },
  emits: ['updateMsg'],
  setup(props, { emit, attrs }: any) {
    return (props:any) => {
      watch(
        props.msg,
        (val) => {
          console.log('18', val)
        },
        { immediate: true }
      )
      return h(
        "div", // 标签,只写标签名,不写<>
        { // 属性
          ref: 'test-render-ref',
          class: 'test-render-class',
          // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
        },
        [ // 子元素
          h(ElInput,{
            ...ElInput.$el,
            ...ElInput.$attrs,
            class: 'test-render-class-child',
            placeholder: '请输入内容',
            style: {
              color: 'FF0000'
            },
            modelValue: props.msg,
            "onUpdate:modelValue": ($event:any) => {
              console.log('25', $event)
              console.log('27', ElInput)
              emit('updateMsg', $event)
            },
          })
        ]
      );
    };
  }
})
</script>

这里通过emit调用父组件的方法,改变值,然后再次单向数据流传递到子组件,子组件input数据更新。

这种方法在父组件定义数据,在子组件实现逻辑,再返回数据到父组件,个人认为是适合封装复杂组件的。

二、示例二:

<script lang="ts">
import { ElInput } from "element-plus";
import { defineComponent, h, ref } from "vue";
export default defineComponent({
  props: {
    msg: {
      type: String,
      default: '',
    },
  },
  emits: ["updateMsg"],
  setup(props, { emit, attrs }: any) {
    return () => {
      let inputValue = ref("123456");
      return h(
        "div", // 标签,只写标签名,不写<>
        {
          // 属性
          ref: "test-render-ref",
          class: "test-render-class",
          // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
        },
        [
          // 子元素
          h(
            ElInput,
            {
              ...ElInput.$el,
              ...ElInput.$attrs,
              class: "test-render-class-child",
              placeholder: "请输入内容",
              style: {
                color: "FF0000",
              },
              modelValue: inputValue.value,
              "onUpdate:modelValue": ($event: any) => {
                // 实现了数据更新
                return (inputValue.value = $event.target.value);
              }
            }
          )
        ]
      )
    }
  }
})
</script>

在"onUpdate:modelValue" 里实现修改后的值

三、示例三:

父组件:

<template>
  <div class="home">
    <render-input
      :msg="title"
      @updateMsg="updateMsg"
    >
    </render-input>
  </div>
</template>
<script lang="ts">
import { Options, Vue } from 'vue-class-component';
import renderInput from './components/renderDiv.vue';
@Options({
  components: {
    renderInput,
  },
})
export default class Home extends Vue {
  public title = 'title'
  public updateMsg(val:any){
    console.log('23um', val)
    this.title = val
  }
}
</script>

子组件:

<script lang="ts">
import { ElInput } from "element-plus";
import { defineComponent, h, ref } from "vue";
export default defineComponent({
  props: {
    msg: {
      type: String,
      default: '',
    },
  },
  emits: ["updateMsg"],
  setup(props, { emit, attrs }: any) {
    return () => {
      let inputValue = ref("123456");
      console.log('16inputValue', inputValue.value)
      if(props.msg){
        inputValue.value = props.msg
      }
      return h(
        "div", // 标签,只写标签名,不写<>
        {
          // 属性
          ref: "test-render-ref",
          class: "test-render-class",
          // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
        },
        [
          // 子元素
          h(
            ElInput,
            {
              ...ElInput.$el,
              ...ElInput.$attrs,
              class: "test-render-class-child",
              placeholder: "请输入内容",
              style: {
                color: "FF0000",
              },
              modelValue: inputValue.value,
              "onUpdate:modelValue": ($event: any) => {
                // 实现了数据更新
                return (inputValue.value = $event.target.value);
              },
            },
          ),
          h("span", {
            class: "test-render-class-button",
            style: {
              color: "#FF0000",
              border: "1px solid #ccc",
              width: "60px",
              cursor: "pointer",
            },
            innerHTML: "提交",
            onClick: () => {
              emit('updateMsg', inputValue.value += 's-i')
            },
          }),
        ]
      );
    };
  },
});
</script>

四、欢迎交流指正,关注我一起学习。

相关文章
|
24天前
|
JavaScript
在 Vue 中处理组件选项与 Mixin 选项冲突的详细解决方案
【10月更文挑战第18天】通过以上的分析和探讨,相信你对在 Vue 中使用 Mixin 时遇到组件选项与 Mixin 选项冲突的解决方法有了更深入的理解。在实际开发中,要根据具体情况灵活选择合适的解决方案,以确保代码的质量和可维护性。
80 7
|
12天前
|
缓存 搜索推荐 索引
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。
51 7
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
|
4天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
14天前
|
自然语言处理 开发者
「Mac畅玩鸿蒙与硬件11」鸿蒙 UI 组件篇1 - Text 和 Button 组件详解
本篇将详细介绍鸿蒙应用开发中的 Text 和 Button 组件。通过本篇内容,你将学习如何使用 Text 组件显示文本、格式化文本样式,以及如何使用 Button 组件处理点击事件并自定义样式。掌握这些基本组件的用法将为后续的 UI 开发奠定基础。
41 4
「Mac畅玩鸿蒙与硬件11」鸿蒙 UI 组件篇1 - Text 和 Button 组件详解
|
7天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
7天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
23天前
|
缓存 JavaScript UED
Vue 的动态组件与 keep-alive
【10月更文挑战第19天】总的来说,动态组件和 `keep-alive` 是 Vue.js 中非常实用的特性,它们为我们提供了更灵活和高效的组件管理方式,使我们能够更好地构建复杂的应用界面。深入理解和掌握它们,以便在实际开发中能够充分发挥它们的优势,提升我们的开发效率和应用性能。
43 18
|
18天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
22天前
|
前端开发 UED
vue3知识点:Suspense组件
vue3知识点:Suspense组件
30 4
|
21天前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
24 1