searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Vue3学习之JSX语法

2023-06-28 09:18:07
47
0

1. 定义

  • 在JavaScript中写HTML,是对JavaScript语法的一个扩展。
  • ref不能自动解包,需要使用.value。

2. JSX语法

2.1 插值

JSX:单大括号{}包裹变量,无引号“”,内写有效的JavaScript表达式。
template:双大括号{{}}包裹变量,属性变量用冒号:开头。
// JSX

const render = () => {
    return <>
        <span name={name}>{ name }</span>
    </>
}

// template

<template>
  <span :name="name">{{ name }}</span>
</template>

2.2 类名绑定class 

JSX:静态指定使用class="",动态指定使用模板字符串,单大括号包裹。

// JSX

<div className={ `${ row.status ? "status-click" : "" }` }>{row.status}</div>

2.3 事件绑定 

JSX:在事件名称前端加上on前缀,原生事件名称前端加上nativeOn,使用箭头函数包裹带参数的函数。
template:@前缀,双引号包裹。
// JSX

const render = (row: any) => {
    return <>
        <span onClick={() => handleClick(row)}>{ row.name }</span>
        <span nativeOnClick={() => handleClick(row)}>{ row.name }</span>
    </>
}

// template

<template>
   <span @click="handleClick">{{ name }}</span>
</template>

2.4 条件渲染v-if实现 

JSX:if/else逻辑;三元表达式;&&;|| 运算。不支持v-if
template:v-if
// JSX

render: ({ row }) => {
    if(row.name) {
        return <span>{row.name}</span>
    } else {
        return <span>--</span>
    }
}

render: ({ row }) => {
      return row.name? row.name: "--";
    }

2.5 循环渲染v-for实现 

JSX:使用Array.map()循环实现。不支持v-for
template:v-for
// JSX

render: ({ row }) => {
    const arr = ref([ {label: "a"}, {label: "b"}, {label: "c"} ])
    return (
        <div>
            { arr.value.map(item => <span key={item.label}>{ item.label }</span>) }
        </div>
    )
}

// template

<tempalte>
    <span v-for="item in arr" :key="item.label">{{ item.label }}</span>
</template>

2.6 插槽v-slots 

JSX:v-slots,简写#,函数式组件。使用this.$slots访问静态插槽内容。
template:v-slot
// JSX

render: ({ row }) => {
    return (
        <div class="page-header__title">
            {this.$slots.title ? this.$slots.title : this.title}
        </div>
    )
}

// template

<div class="page-header__title">
    <slot name="title">{{ title }}</slot>
</div>

2.7  组件拆分

JSX:组件拆分时,外层必须有一个包裹元素。
// JSX

render: ({ row }) => {
    return (
        <div>
            <p>one</p>
            <p>two</p>
        </div>
    )
}

2.8  自定义组件

JSX:组件名遵守驼峰命名法,组件名称和引入名称保持一致,引入动态参数不加冒号“”。
template:组件名可用段横杠-连接,引入动态参数加冒号“”。
import StatusIcon '@/components/StatusIcon.vue'

// JSX

const render = () => {
    const iconRef = ref({ 0: "icon-active", 1: "icon-down" })
    const statusRef = ref({ 0: "开机", 1: "关机" })
    return <>
        <StatusIcon 
            iconName={iconRef.value[row.status]}
            statusName={statusRef.value[row.status]}
        >
        </StatusIcon>
    </>
  }
  return render
})

// template

<template>
    <div class="status">
        <status-icon :iconName="iconRef"/>
    </div>
</template>
0条评论
0 / 1000
d****n
3文章数
0粉丝数
d****n
3 文章 | 0 粉丝
d****n
3文章数
0粉丝数
d****n
3 文章 | 0 粉丝
原创

Vue3学习之JSX语法

2023-06-28 09:18:07
47
0

1. 定义

  • 在JavaScript中写HTML,是对JavaScript语法的一个扩展。
  • ref不能自动解包,需要使用.value。

2. JSX语法

2.1 插值

JSX:单大括号{}包裹变量,无引号“”,内写有效的JavaScript表达式。
template:双大括号{{}}包裹变量,属性变量用冒号:开头。
// JSX

const render = () => {
    return <>
        <span name={name}>{ name }</span>
    </>
}

// template

<template>
  <span :name="name">{{ name }}</span>
</template>

2.2 类名绑定class 

JSX:静态指定使用class="",动态指定使用模板字符串,单大括号包裹。

// JSX

<div className={ `${ row.status ? "status-click" : "" }` }>{row.status}</div>

2.3 事件绑定 

JSX:在事件名称前端加上on前缀,原生事件名称前端加上nativeOn,使用箭头函数包裹带参数的函数。
template:@前缀,双引号包裹。
// JSX

const render = (row: any) => {
    return <>
        <span onClick={() => handleClick(row)}>{ row.name }</span>
        <span nativeOnClick={() => handleClick(row)}>{ row.name }</span>
    </>
}

// template

<template>
   <span @click="handleClick">{{ name }}</span>
</template>

2.4 条件渲染v-if实现 

JSX:if/else逻辑;三元表达式;&&;|| 运算。不支持v-if
template:v-if
// JSX

render: ({ row }) => {
    if(row.name) {
        return <span>{row.name}</span>
    } else {
        return <span>--</span>
    }
}

render: ({ row }) => {
      return row.name? row.name: "--";
    }

2.5 循环渲染v-for实现 

JSX:使用Array.map()循环实现。不支持v-for
template:v-for
// JSX

render: ({ row }) => {
    const arr = ref([ {label: "a"}, {label: "b"}, {label: "c"} ])
    return (
        <div>
            { arr.value.map(item => <span key={item.label}>{ item.label }</span>) }
        </div>
    )
}

// template

<tempalte>
    <span v-for="item in arr" :key="item.label">{{ item.label }}</span>
</template>

2.6 插槽v-slots 

JSX:v-slots,简写#,函数式组件。使用this.$slots访问静态插槽内容。
template:v-slot
// JSX

render: ({ row }) => {
    return (
        <div class="page-header__title">
            {this.$slots.title ? this.$slots.title : this.title}
        </div>
    )
}

// template

<div class="page-header__title">
    <slot name="title">{{ title }}</slot>
</div>

2.7  组件拆分

JSX:组件拆分时,外层必须有一个包裹元素。
// JSX

render: ({ row }) => {
    return (
        <div>
            <p>one</p>
            <p>two</p>
        </div>
    )
}

2.8  自定义组件

JSX:组件名遵守驼峰命名法,组件名称和引入名称保持一致,引入动态参数不加冒号“”。
template:组件名可用段横杠-连接,引入动态参数加冒号“”。
import StatusIcon '@/components/StatusIcon.vue'

// JSX

const render = () => {
    const iconRef = ref({ 0: "icon-active", 1: "icon-down" })
    const statusRef = ref({ 0: "开机", 1: "关机" })
    return <>
        <StatusIcon 
            iconName={iconRef.value[row.status]}
            statusName={statusRef.value[row.status]}
        >
        </StatusIcon>
    </>
  }
  return render
})

// template

<template>
    <div class="status">
        <status-icon :iconName="iconRef"/>
    </div>
</template>
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0