Vue3 使用 JSX(笔记自用)

目录

1. Vue3 中 JSX 的基本应用

1.1 在 .vue 文件中使用 jsx

1.2 .jsx文件格式

2. JSX 和 template 的区别

2.1 插值

2.2 自定义组件

2.3 属性和事件

2.4 条件和循环 

3. JSX 和 slot (体会 JSX 的优越性)


1. Vue3 中 JSX 的基本应用

  • 使用 .jsx 格式文件和 defineComponent
  • defineComponent 可传入 setup 函数 或 组件的配置
  • 插值使用单括号 {}

1.1 在 .vue 文件中使用 jsx

// 父

<template>
  <div class="home">
    <JSXDemo1 />
  </div>
</template>

<script>
import JSXDemo1 from '@/components/JSXDemo1.vue'
export default {
  name: 'HomeView',
  components: {
    JSXDemo1
  }
}
</script>

// JSXDemo1.vue

<script>
import { ref } from 'vue'
export default {
  setup () {
    const countRef = ref(200)

    const render = () => {
      return <p>DEMO1--{countRef.value}</p> // jsx就是js语法,所以要加 .value
    }
    return render
  }
}
</script>


1.2 .jsx文件格式

// 父组件

import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'

export default defineComponent(() => { // 传入 setup 函数
  const countRef = ref(300)

  const render = () => {
    return <>
      <p>DEMO2--{countRef.value}</p>
      <JSXChild a={countRef.value + 100}></JSXChild>
    </>
  }
  return render 
})


// 子组件 JSXChild.jsx

import { defineComponent } from 'vue'

export default defineComponent({ // 传入组件配置
  props: ['a'],
  setup (props) {
    const render = () => {
      return <>
        <p>child {props.a}</p>
      </>
    }
    return render
  }
})

2. JSX 和 template 的区别

  • 语法上有很大区别
  • JSX 本质就是 js 代码,可以使用 js 的任何能力
  • template 只能嵌入简单的 js 表达式,其他需要指令,如 v-if
  • JSX 已经成为 ES 规范,template 还是 Vue 自家规范
  • 本质是相同的:
  • 都会被编译为 js 代码(render 函数)

2.1 插值

  • template 使用双括号 {{ }}
  • jsx 使用单括号 { }
// template

<template>
  <p>{{ name }} -- {{ age }}</p>
</template>

// jsx

const render = () => {
    return <>
        <p>child {props.a}</p>
    </>
}

2.2 自定义组件

  • template 组件名使用时可改变大小写或是驼峰,jsx 不可更改
  • 引入动态参数,template使用冒号+参数名(:msg='msg'),jsx 不需要冒号
// template

<template>
  <div class="home">
    <watch-effect :msg="msgRef"/>
  </div>
</template>

<script>
import { ref } from 'vue'
import WatchEffect from '@/components/WatchEffect.vue'
export default {
  name: 'HomeView',
  components: {
    WatchEffect,
  },
  setup () {
    const msgRef = ref('123')
    return {
        msgRef
    }
  }
}
</script>

// jsx 组件名称不可变,要和引入名字保持一致

import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'

export default defineComponent(() => {
  const countRef = ref(300)

  const render = () => {
    return <>
      <p>DEMO2--{countRef.value}</p>
      <JSXChild a={countRef.value + 100}></JSXChild>
    </>
  }
  return render
})

2.3 属性和事件

  • template 区分属性和事件的写法,jsx 不区分
// jsx 属性和事件的写法一样

import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'

export default defineComponent(() => {
  const countRef = ref(300)

  function onChange () {
    console.log('onChange')
  }
  const render = () => {
    return <>
      <p>DEMO2--{countRef.value}</p>
      <JSXChild a={countRef.value + 100} change={onChange}></JSXChild>
    </>
  }
  return render
})

2.4 条件和循环 

  • 条件 template 使用 v-if 指令,jsx 在表达式中使用 && (类似 if( a && b))
// template v-if

<template>
  <p v-if="flagRef">template demo</p>
  <button @click="changeFlagRef">click</button>
</template>
<script>
import { ref } from 'vue'
export default {
  setup () {
    const flagRef = ref(true)

    function changeFlagRef () {
      flagRef.value = !flagRef.value
    }

    return {
      flagRef,
      changeFlagRef
    }
  }
}
</script>

// jsx &&符号判断

import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'

export default defineComponent(() => {
  const flagRef = ref(true)

  function changeFlagRef () {
    flagRef.value = !flagRef.value
  }

  const render = () => {
    return <>
      <p onClick={changeFlagRef}>DEMO2--{flagRef.value.toString()}</p>
      {flagRef.value && <JSXChild a={flagRef.value}></JSXChild>}
    </>
  }
  return render
})
  •  循环 template 使用 v-for 指令,jsx 使用数组的 .map 函数
// template v-for

<template>
  <ul>
    <li v-for="item in state.list" :key="item">{{ item }}</li>
  </ul>
</template>
<script>
import { reactive } from 'vue'
export default {
  setup () {
    const state = reactive({
      list: ['a', 'b', 'c']
    })

    return {
      state
    }
  }
}
</script>

// jsx 数组 .map 函数

import { defineComponent, reactive } from 'vue'

export default defineComponent(() => {
  const state = reactive({
    list: ['a1', 'b1', 'c1']
  })

  const render = () => {
    return <>
      <ul>
        {state.list.map(item => <li>{item}</li>)}
      </ul>
    </>
  }
  return render
})

3. JSX 和 slot (体会 JSX 的优越性)

  • slot 是 Vue 发明的概念,为了完善 template 的能力
  • slot 一直是 Vue 初学者的“噩梦”,特别是:作用域 slot
  • 但使用 JSX 将很容易理解,因为 JSX 本质就是 js
### Vue 3 JSX 使用教程及示例 Vue 3 提供了对 JSX 的支持,允许开发者通过 JavaScript 表达式构建 UI。以下是关于 Vue 3JSX 的基本用法以及一些常见问题的解决方案。 #### 基本概念 JSX 是一种语法扩展,它使得在 JavaScript 中编写 HTML 更加直观。Vue 3 支持使用 JSX 编写组件,并提供了 `defineComponent` 方法来定义基于函数的组件[^1]。 #### 安装依赖 为了在项目中启用 Vue 3JSX 功能,需要安装相应的插件和支持库: ```bash npm install @vitejs/plugin-vue-jsx vue ``` 如果使用的是 Vite 构建工具,则可以通过配置文件引入插件以支持 JSX 文件解析。 #### 示例代码 下面展示了一个完整的 Vue 3 JSX 组件实例: ```javascript import { defineComponent } from &#39;vue&#39;; export default defineComponent({ setup() { const message = "Hello, Vue 3 JSX!"; return () => ( <div> <h1>{message}</h1> {/* 渲染动态文本 */} <button onClick={() => alert(&#39;Button clicked!&#39;)}>Click Me</button> {/* 添加事件监听器 */} </div> ); } }); ``` 此代码片段创建了一个简单的 Vue 3 组件,在其中利用 JSX 结构化地描述界面逻辑并绑定交互行为。 #### v-model 实现双向数据绑定 对于表单输入元素来说,可以借助 `v-model` 属性实现自动同步状态更新的功能。虽然传统模板方式下可以直接书写 `<input v-model="value">` ,但在 JSX 场景里需手动指定属性名称与方法处理程序完成相同效果: ```javascript setup(){ let inputValue = ref(&#39;&#39;); function updateValue(event){ inputValue.value=event.target.value; } return ()=>( <> <input type=&#39;text&#39; value={inputValue.value} onInput={(e)=>updateValue(e)} /> <p>You typed: {inputValue.value}</p> </> ) } ``` 上述例子演示了如何模拟标准 `v-model` 操作模式下的功能实现过程. #### 控制 DOM 显示/隐藏(v-if 替代方案) 当涉及到条件渲染时(即根据布尔表达式的真假决定是否挂载某个节点),原生 Vue 模板提供有便捷指令如 `v-if`, 而切换到 JSX 后则改由三元运算符(`condition ? trueBlock : falseBlock`)达成相似目的 : ```javascript return ()=>{ const showContent=true; return( <div> {showContent?<span>This is visible content.</span>:null} </div> ) }; ``` 这里采用三元判断语句替代原本可能使用的 `v-if` 指令形式[^2]. #### 总结 综上所述,尽管 Vue 3 JSX 需要更多手动作业去模仿某些内置特性的表现,但它赋予开发人员更大的灵活性和自由度来进行复杂场景定制化需求满足的同时保持清晰可读性强的优势.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值