vuejs / jsx-vue2

monorepo for Babel / Vue JSX related packages
https://jsx-vue2-playground.netlify.app/
1.47k stars 96 forks source link

Using jsx in el-table-column's formatter function #194

Open youthug opened 3 years ago

youthug commented 3 years ago

Hi there. I defined a variable: columns in column-config.js :

const columns = [
    {
        label: 'First Name',
        prop: 'firstName',
        defaultShow: true,
        minWidth: '180px',
        // TODO return el-tag
        formatter(row, column, cellValue) {
            return (
                <el-tag>{ cellValue }</el-tag>
            )
        }
    },
    {
        label: 'Last Name',
        prop: 'lastName',
        defaultShow: true,
        minWidth: '180px'
    }
]

export {
    columns
}

And use it in App.vue:

<template>
    <div id="app">
        <el-table :data="tableData">
            <!-- bind all attrs -->
            <el-table-column v-for="(col, i) in columns" :key="i" v-bind="col"/>
        </el-table>
    </div>
</template>

<script>
import { columns } from "@/config/column-config";

...

Then I got errors in console: TypeError: h is not a function image

Here is my code: jsx-demo

Is there any way to return templates in .js files outside render and data function?

Thx.

HawtinZeng commented 1 year ago

I have extracted the JSX template into another SFC, it is pretty complicated, but it works! I found something interesting when I used function declaration directly in the script tag of a SFC outside of the render function, I got an error that prompted me "h is not defined", but when I used the function declaration inside an Object, like ` const testTemplateGenerator = { renderColFormItem() { return (

123

)

} } // call in render function: return testTemplateGenerator.renderColFormItem.call(this) `, The error is gone! I guess that curly braces may create a scope that provides the "h" function.