Skip to content

自定义jsx

因为目前的低代码配置满足不了一些定制化场景的需要,类似于表格单元格的内容,步骤条的内容等,需要可以自定义内容展示,我们在渲染函数中增加可返回jsx语法,便于用户自定义渲染内容。

Vue中使用jsx注意点

1、事件处理:在 JSX 中,你需要使用 on 前缀来监听事件,而不是 v-on。例如,使用 onClick 而不是 v-on:click

html
<button onClick={this.handleClick}>Click me</button>

2、v-for:在 JSX 中,你不能直接使用 v-for 指令。你需要使用 JavaScript 的 map 函数来遍历数组。

javascript
{this.items.map(item => <li>{item}</li>)}

3、v-model:在 JSX 中,你不能直接使用 v-model 指令。你需要手动实现数据双向绑定。例如,使用 value 属性和 input 事件

html
<input
  value={this.message}
  onInput={event => {
    this.message = event.target.value;
  }}
/>

4、v-show:在 JSX 中,你不能直接使用 v-show 指令。你需要使用 style 属性来控制元素的显示和隐藏。

html
<div style={{ display: this.isVisible ? 'block' : 'none' }}></div>

5、v-html 和 v-text:在 JSX 中,你不能直接使用 v-html 和 v-text 指令。你需要使用 innerHTML 属性和 {} 表达式

html
<div innerHTML={this.htmlContent}></div>
<p>{this.textContent}</p>

6、样式

style 方式:

html
<div style="background: #fff"></div>

class 方式: 在组件的自定义样式配置中添加 class, 例如:

less
:rootnode {
  .custom-style {
    background: #fff;
  }
}

7、插槽 示例如下:

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Button,
    Icon
  } = ctx.com;

  return <Button type="primary">{{
      default: () => '按钮',
      icon: () => <Icon icon="icon-question-circle" />
    }}</Button>
}

内置基础组件使用

Button

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Button
  } = ctx.com;
  const btnClick = () => {
    console.log("按钮点击")
  }
  // 按钮属性与arco按钮属性一致
  return <Button type="primary" onClick={btnClick}>按钮</Button>
}

Tag

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Tag
  } = ctx.com;
  
  // 标签属性与arco标签属性一致
  return <Tag color="green">标签</Tag>
}

Icon

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {Icon} = ctx.com;

  return <Icon icon="icon-heart-fill" size="20" color="red"></Icon>
}

Switch

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Switch
  } = ctx.com;

  const changeOpen = (v) => {
    ctx.setState({
      open: v
    })
  }

  return <Switch model-value={ctx.state.open} onChange={(v) => changeOpen(v)}></Switch>
}

Input

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Input
  } = ctx.com;

  const changeValue = (v) => {
    ctx.setState({
      inputValue: v
    })
  }

  return <Input model-value={ctx.state.inputValue} onInput={(v) => changeValue(v)}></Input>
}

Tooltip

javascript
function render(ctx, params) {
  // 返回jsx渲染内容
  const {
    Tooltip,
    Icon
  } = ctx.com;

  return <Tooltip content="这是提示内容">
    <Icon icon="icon-question-circle" />
  </Tooltip>
}

自定义渲染函数示例

javascript
function render(ctx, params) {
  const spanClick = () => {
   ctx.setState({
        text: "hello!!!"
    });
  }
  return (<div>
  <span style={{color: "pink"}}>{params.item.title}</span>
  <span style={{color: "purple"}} onClick={spanClick}>
    {ctx?.state?.text}
    <i>hahah</i>
  </span>
  </div>)
}