当前位置:   article > 正文

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

render element-plus

一、示例一:

父组件:

  1. <template>
  2. <div class="home">
  3. <render-input
  4. :msg="title"
  5. @updateMsg="updateMsg"
  6. >
  7. </render-input>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { Options, Vue } from 'vue-class-component';
  12. import renderInput from './components/render-components2.vue';
  13. @Options({
  14. components: {
  15. renderInput,
  16. },
  17. })
  18. export default class Home extends Vue {
  19. public title = 'title'
  20. public updateMsg(val:any){
  21. console.log('23um', val)
  22. this.title = val
  23. }
  24. }
  25. </script>

子组件:

  1. <script lang="ts">
  2. import { ElInput } from "element-plus";
  3. import { defineComponent, h, watch } from "vue";
  4. export default defineComponent({
  5. props: {
  6. msg: {
  7. type: String,
  8. default: '',
  9. },
  10. },
  11. emits: ['updateMsg'],
  12. setup(props, { emit, attrs }: any) {
  13. return (props:any) => {
  14. watch(
  15. props.msg,
  16. (val) => {
  17. console.log('18', val)
  18. },
  19. { immediate: true }
  20. )
  21. return h(
  22. "div", // 标签,只写标签名,不写<>
  23. { // 属性
  24. ref: 'test-render-ref',
  25. class: 'test-render-class',
  26. // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
  27. },
  28. [ // 子元素
  29. h(ElInput,{
  30. ...ElInput.$el,
  31. ...ElInput.$attrs,
  32. class: 'test-render-class-child',
  33. placeholder: '请输入内容',
  34. style: {
  35. color: 'FF0000'
  36. },
  37. modelValue: props.msg,
  38. "onUpdate:modelValue": ($event:any) => {
  39. console.log('25', $event)
  40. console.log('27', ElInput)
  41. emit('updateMsg', $event)
  42. },
  43. })
  44. ]
  45. );
  46. };
  47. }
  48. })
  49. </script>

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

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

二、示例二:

  1. <script lang="ts">
  2. import { ElInput } from "element-plus";
  3. import { defineComponent, h, ref } from "vue";
  4. export default defineComponent({
  5. props: {
  6. msg: {
  7. type: String,
  8. default: '',
  9. },
  10. },
  11. emits: ["updateMsg"],
  12. setup(props, { emit, attrs }: any) {
  13. return () => {
  14. let inputValue = ref("123456");
  15. return h(
  16. "div", // 标签,只写标签名,不写<>
  17. {
  18. // 属性
  19. ref: "test-render-ref",
  20. class: "test-render-class",
  21. // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
  22. },
  23. [
  24. // 子元素
  25. h(
  26. ElInput,
  27. {
  28. ...ElInput.$el,
  29. ...ElInput.$attrs,
  30. class: "test-render-class-child",
  31. placeholder: "请输入内容",
  32. style: {
  33. color: "FF0000",
  34. },
  35. modelValue: inputValue.value,
  36. "onUpdate:modelValue": ($event: any) => {
  37. // 实现了数据更新
  38. return (inputValue.value = $event.target.value);
  39. }
  40. }
  41. )
  42. ]
  43. )
  44. }
  45. }
  46. })
  47. </script>

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

三、示例三:

父组件:

  1. <template>
  2. <div class="home">
  3. <render-input
  4. :msg="title"
  5. @updateMsg="updateMsg"
  6. >
  7. </render-input>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { Options, Vue } from 'vue-class-component';
  12. import renderInput from './components/renderDiv.vue';
  13. @Options({
  14. components: {
  15. renderInput,
  16. },
  17. })
  18. export default class Home extends Vue {
  19. public title = 'title'
  20. public updateMsg(val:any){
  21. console.log('23um', val)
  22. this.title = val
  23. }
  24. }
  25. </script>

子组件:

  1. <script lang="ts">
  2. import { ElInput } from "element-plus";
  3. import { defineComponent, h, ref } from "vue";
  4. export default defineComponent({
  5. props: {
  6. msg: {
  7. type: String,
  8. default: '',
  9. },
  10. },
  11. emits: ["updateMsg"],
  12. setup(props, { emit, attrs }: any) {
  13. return () => {
  14. let inputValue = ref("123456");
  15. console.log('16inputValue', inputValue.value)
  16. if(props.msg){
  17. inputValue.value = props.msg
  18. }
  19. return h(
  20. "div", // 标签,只写标签名,不写<>
  21. {
  22. // 属性
  23. ref: "test-render-ref",
  24. class: "test-render-class",
  25. // innerHTML: 'test-render-html' // 这里打开后子元素里边innerHTML内容不能展示
  26. },
  27. [
  28. // 子元素
  29. h(
  30. ElInput,
  31. {
  32. ...ElInput.$el,
  33. ...ElInput.$attrs,
  34. class: "test-render-class-child",
  35. placeholder: "请输入内容",
  36. style: {
  37. color: "FF0000",
  38. },
  39. modelValue: inputValue.value,
  40. "onUpdate:modelValue": ($event: any) => {
  41. // 实现了数据更新
  42. return (inputValue.value = $event.target.value);
  43. },
  44. },
  45. ),
  46. h("span", {
  47. class: "test-render-class-button",
  48. style: {
  49. color: "#FF0000",
  50. border: "1px solid #ccc",
  51. width: "60px",
  52. cursor: "pointer",
  53. },
  54. innerHTML: "提交",
  55. onClick: () => {
  56. emit('updateMsg', inputValue.value += 's-i')
  57. },
  58. }),
  59. ]
  60. );
  61. };
  62. },
  63. });
  64. </script>

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/300026
推荐阅读