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>

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

相关文章
|
15天前
|
JavaScript
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
15天前
|
JavaScript
vue3 element-ui-plus Carousel 跑马灯 的使用 及 踩坑记录
本文介绍了在Vue 3中使用Element UI Plus的Carousel组件实现跑马灯效果的方法,并分享了在实现过程中遇到的常见问题和解决方案。
vue3 element-ui-plus Carousel 跑马灯 的使用 及 踩坑记录
|
15天前
|
JavaScript 前端开发 开发工具
使用vue3+element-ui plus 快速构建后台管理模板
本文介绍了如何使用Vue 3和Element UI Plus快速构建后台管理模板的步骤,包括安装Vue 3脚手架、Element UI Plus以及如何全局配置Element UI Plus。然后详细讲解了如何使用Element UI Plus构建布局,包括Header组件、Aside组件和HomeView视图的创建和样式调整,以及App.vue和main.css的修改,最后提供了项目的文件结构图和效果展示。
使用vue3+element-ui plus 快速构建后台管理模板
|
1天前
Element-UI组件的使用
【10月更文挑战第1天】
5 0
|
24天前
|
JavaScript
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
其实这个从零有点歧义,因为本质上是要基于`tdesign-vue-next`来进行二次封装为一套广告UI组件库,现在让我们在一起快乐的搭建自己的广告UI库之前,先对以下内容做出共识:
51 0
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
|
2月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
73 0
|
2月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
121 0
|
2月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
105 0
|
5月前
|
前端开发 搜索推荐 开发者
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
|
5月前
|
JavaScript 前端开发 开发者
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍

热门文章

最新文章