首页 > 其他分享 >vue3 tsx 测试几种使用方式

vue3 tsx 测试几种使用方式

时间:2024-09-05 23:13:39浏览次数:10  
标签:return tsx render vue3 几种 param1 props console log

总论

  • tsx setup里面定义了return dom 元素,则options api的 render函数不生效
  • options 的render函数生效前提是setup里面不能return dom
  • options 的render里面可以直接使用this访问setup里面的数据或者ctx
  • tsx一般最好用defineComponent包裹,这样响应式才能生效
  • tsx dom语法 使用{} 渲染变量, 使用onClick等直接触发事件,.value 访问ref数据
  • tsx 放在setup return 则需要返回的是一个函数,函数里面放tsx

代码测试

  • 父组件
<template>
    <div class="component-name">
        <child :render="render" :params1="abc" />
    </div>
</template>

<script setup lang="ts">
import { ref, reactive, computed, onMounted, nextTick } from 'vue';
import child from './components/child';
import { ElInput } from 'element-plus';
const abc = ref('sdlfkjsdfj');
const render = (h) => {
    const text = ref('');
    return h('input', {
        type: 'text',
        modelValue: text.value, // 使用modelValue 而不是value传递输入框的值
        onInput: (e) => {
            text.value = e.target.value; // 更新 text.value
        }
    });
};

setTimeout(() => {
    abc.value = '中文';
}, 3000);
</script>

<style lang="scss" scoped></style>

  • 子组件使用方式1
import { defineComponent, PropType, h, computed } from 'vue';
export default defineComponent({
    name: 'PageF',
    props: {
        render: Function as PropType<(...args: any) => any>,
        params1: String as PropType<string>
    },
    setup(props) {
        const { render } = props;

        const param1 = computed(() => props.params1);

        console.log(param1.value, 'param1');

        return () => {
            return render && render(h);
        };
    }
});
  • 子组件使用方式2
import { defineComponent, PropType, h, computed } from 'vue';
export default defineComponent({
    name: 'PageF',
    props: {
        render: Function as PropType<(...args: any) => any>,
        params1: String as PropType<string>
    },
    setup(props) {
        const { render } = props;

        const param0 = computed(() => props.params1); //这样可以监听到props.params1 外面数据的变化
        const param1 = ref(props.params1); //这样是内部单独建立一份ref,props外部改变,不影响该数据

        console.log(param1, 'param1');

        //不能监听到
        watch(param1, () => {
            console.log(param1.value, 'param1_change');
        });

        //可以监听到
        watch(param0, () => {
            console.log(param0.value, 'param0_change');
        });

        return () => {
            return render && render(h);
        };
    }
});

  • 使用方式3
import { defineComponent, PropType, h, computed } from 'vue';
export default defineComponent({
    name: 'PageF',
    props: {
        render: Function as PropType<(...args: any) => any>,
        params1: String as PropType<string>
    },
    setup(props) {
        const { render } = props;

        const param0 = computed(() => props.params1); //这样可以监听到props.params1 外面数据的变化
        const param1 = ref(props.params1); //这样是内部单独建立一份ref,props外部改变,不影响该数据

        console.log(param1, 'param1');

        //不能监听到
        watch(param1, () => {
            console.log(param1.value, 'param1_change');
        });

        //可以监听到
        watch(param0, () => {
            console.log(param0.value, 'param0_change');
        });
        // return (<div>slkfsjfdksd</div>) 这样不能渲染dom,需要返回函数,函数里面再放dom
        return () => <div>sdlfkjsfkjsd</div>;
    }
});
  • 使用方式4
import { defineComponent, PropType, h, computed } from 'vue';
export default defineComponent({
    name: 'PageF',
    props: {
        render: Function as PropType<(...args: any) => any>,
        params1: String as PropType<string>
    },
    setup(props) {
        const { render } = props;

        const param0 = computed(() => props.params1); //这样可以监听到props.params1 外面数据的变化
        const param1 = ref(props.params1); //这样是内部单独建立一份ref,props外部改变,不影响该数据

        console.log(param1, 'param1');

        //不能监听到
        watch(param1, () => {
            console.log(param1.value, 'param1_change');
        });

        //可以监听到
        watch(param0, () => {
            console.log(param0.value, 'param0_change');
        });
        // return (<div>slkfsjfdksd</div>) 这样不能渲染dom,需要返回函数,函数里面再放dom
        // return () => <div>sdlfkjsfkjsd</div>;
    },
    //这个render函数能够运行的前提是 setup里面不返回return dom
    render: (ctx, no, props) => {
        console.log(ctx, 'ctx');
        console.log(no, 'nonsdjflsjdf');
        console.log(props, 'props');
        // return <div>23424342</div>;

        return h('div', {}, 'sdlkfjsldfjsldfjsl');
    }
});
  • 使用方式4
import { defineComponent, PropType, h, computed } from 'vue';
export default {
    name: 'PageF',
    props: {
        render: Function as PropType<(...args: any) => any>,
        params1: String as PropType<string>
    },
    setup(props) {
        const { render } = props;

        const param0 = computed(() => props.params1); //这样可以监听到props.params1 外面数据的变化
        const param1 = ref(props.params1); //这样是内部单独建立一份ref,props外部改变,不影响该数据

        console.log(param1, 'param1');

        //不能监听到
        watch(param1, () => {
            console.log(param1.value, 'param1_change');
        });

        //可以监听到
        watch(param0, () => {
            console.log(param0.value, 'param0_change');
        });
        // return (<div>slkfsjfdksd</div>) 这样不能渲染dom,需要返回函数,函数里面再放dom
        // return () => <div>sdlfkjsfkjsd</div>;
    },
    //这个render函数能够运行的前提是 setup里面不返回return dom
    render: (ctx, no, props) => {
        console.log(ctx, 'ctx');
        console.log(no, 'nonsdjflsjdf');
        console.log(props, 'props');
        // return <div>23424342</div>;

        return h('div', {}, 'sdlkfjsldfjsldfjsl');
    }
};
  • 直接函数
import { defineComponent, PropType, h, computed } from 'vue';

// 不建议这样使用,测试发现.value 无法响应式,最好还是defineComponent 里面使用
export default (props) => {
    console.log(props, 'sldjfslfkjsldfjslf');

    const count = ref(232342342);

    function handleClick() {
        console.log('slfjsf');
        count.value = 475945795;
    }

    return (
        <>
            {/* 响应式无效 */}
            <div>{count.value}</div>
            <button onClick={handleClick}>btn</button>
        </>
    );
};

  • 使用方式n
import { defineComponent, PropType, h, computed } from 'vue';
export default defineComponent({
    setup: (props) => {
        console.log(props, 'sldjfslfkjsldfjslf');

        const count = ref(232342342);

        function handleClick() {
            console.log('slfjsf');
            count.value = 475945795;
        }

        return () => {
            return (
                <>
                    <div>{count.value}</div>
                    <button onClick={handleClick}>btn</button>
                </>
            );
        };
    }
});

标签:return,tsx,render,vue3,几种,param1,props,console,log
From: https://www.cnblogs.com/jocongmin/p/18399378

相关文章

  • 字符串拼接的几种形式
    字符串拼接的几种形式##一.算术运算符1.//+-*/%(取余)2.     intnum=10+10;//20      intnum1=10-10;//0      intnum2=10*10;//100      intnum3=10/10;//1      intnum4=10%......
  • Vue3 中的状态管理:Vuex vs Pinia 深度分析
    Vue3中的状态管理:VuexvsPinia深度分析在现代前端开发中,状态管理是一个至关重要的方面。尤其是在大型应用中,如何高效、清晰地管理状态不仅影响着代码的可读性和可维护性,还对应用的性能有直接的影响。在Vue3中,Vuex和Pinia是两种主要的状态管理库,这两者各有不同的设......
  • 在 Vue3 中使用 CSS Modules 实现样式隔离
    在Vue3中使用CSSModules实现样式隔离随着构建现代前端应用的需要,样式的管理和隔离变得越来越重要。为了解决样式冲突和管理困难的问题,CSSModules应运而生。今天,我们将讨论如何在Vue3中使用CSSModules实现样式隔离,特别是在使用新的setup语法糖的情况下。什么......
  • vue3+vite+echarts集成中国地图
    前段时间我们的项目有使用到echarts集成中国地图的功能,实际上这个功能我进项目组的时候人家就已经完成了,我这边只是简单复刻了一遍,先看看效果图;上代码,走起<template><!--第一步:设置地图容器--><divid="map"style="width:100vw;height:100vh"></div></template>......
  • 计算机毕业设计springboot+vue3便民医疗服务预约系统 原生微信小程序
    目录博主介绍技术栈开发核心技术具体实现截图前端后端java类核心代码部分展示可行性论证技术可行性详细视频演示系统测试实现思路源码获取博主介绍......
  • 这应该是全网最详细的Vue3.5版本解读kh
    合集-vue3代码修炼秘籍(16)1.答应我,在vue中不要滥用watch好吗?02-292.一文搞懂Vue3defineModel双向绑定:告别繁琐代码!02-043.没有虚拟DOM版本的vue(VueVapor)01-264.有了CompositionAPI后,有些场景或许你不需要pinia了01-235.你不知道的vue3:使用runWithContext实现在非setup期......
  • 这应该是全网最详细的Vue3.5版本解读
    前言Vue3.5正式版在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章。但是欧阳发现这些文章对3.5中新增的功能介绍都不是很全,所以导致不少同学有个错觉,觉得Vue3.5版本不过如此,选择跳过这个版本等下个大版本再去更新。所以欧阳写了这篇超级详细的Vue3.5版本解读文章,小伙伴......
  • vue3.2 v-model 双向数据绑定实现
    代码实现示例子组件实现双向绑定<template><divclass="component-name"><inputtype="text":value="modelValue"@input="handleChange"/></div></template><scriptsetuplang=&qu......
  • 推荐一款:简单、易懂、功能强大的Vue3可拖拽插件
    第一步:安装npm使用以下命令安装npminstallvue-grid-layout--saveyarn使用以下命令安装yarnaddvue-grid-layout第二步:配置全局变量import{createApp}from'vue'importAppfrom'./App.vue'importVueGridLayoutfrom'vue-grid-layout'//引入layout......
  • SCHNEIDER TSXTIOAS170BDI35600 24VDC IN模块的优缺点
        SCHNEIDERTSXTIOAS170BDI3560024VDCIN模块作为工业自动化控制系统中的关键组件,具有多个显著的优点,这些优点使得它在各种工业应用场合中脱颖而出。以下是对该模块优点的详细阐述:高精度与稳定性:该模块能够高精度地接收和转换24V直流电压信号,确保信号的准确性。同......