Vue3+Vite에서 JSX를 사용하는 방법에 대한 자세한 설명
Vue+Vite에서 JSX를 사용하는 방법은 무엇인가요? 다음 글에서는 Vue3+Vite에서 JSX를 사용하는 방법을 소개하겠습니다. 도움이 되셨으면 좋겠습니다!
【관련 권장 사항: vuejs 비디오 튜토리얼, 웹 프론트 엔드 개발】
JSX 소개
JSX(JavaScript 및 XML)는 HTML-in-JavaScript의 구문 확장으로, 리액트 엔터. JSX는 UI가 상호 작용하는 방식의 본질을 어떻게 표현해야 하는지 설명하는 훌륭한 방법입니다. JSX는 JavaScript 구문의 확장이므로 HTML과 유사한 코드가 JS와 공존할 수 있습니다. 예:
const button = <MyButton color="blue" shadowSize={2}> Click Me </MyButton>
버튼 상수를 JSX 표현식이라고 합니다. 이를 사용하여 애플리케이션에서 <MyButton>
태그를 렌더링할 수 있습니다. 브라우저는 JSX를 직접 읽고 구문 분석할 수 없습니다. (Babel 또는 Parcel과 같은 도구를 사용하여) 컴파일된 후 JSX 표현식은 다음과 같습니다. <MyButton>
标签。浏览器是无法读取直接解析 JSX 的。JSX 表达式经过( Babel 或 Parcel 之类的工具)编译之后是这样的:
React.createElement( MyButton, {color: 'blue', shadowSize: 2}, 'Click Me' )
实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖。可以使用 React.createElement() 自己编写 UI 来跳过编译步骤。但是,这样做会失去 JSX 的声明性优势,并且代码变得更难以阅读。编译是开发过程中的一个额外步骤,但是 React 社区中的许多开发人员都认为 JSX 的可读性值得。另外,流行的工具使 JSX-to-JavaScript 编译成为其设置过程的一部分。除非您愿意,否则不必自己配置编译。如果你想测试一些特定的 JSX 会转换成什么样的 JavaScript,你可以尝试使用 在线的 Babel 编译器。
React 并不强制要求使用 JSX。当你不想在构建环境中配置有关 JSX 编译时,不在 React 中使用 JSX 会更加方便。例如,用 JSX 编写的代码:
class Hello extends React.Component { render() { return <div>Hello {this.props.toWhat}</div>; } } const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<Hello toWhat="World" />);
可以编写为不使用 JSX 的代码:
class Hello extends React.Component { render() { return React.createElement('div', null, `Hello ${this.props.toWhat}`); } } const root = ReactDOM.createRoot(document.getElementById('root')); root.render(React.createElement(Hello, {toWhat: 'World'}, null));
在 Vue3 中使用 JSX
Vue 使用单文件组件,把 template 模板、相关脚本和 CSS 一起整合放在 .vue 结尾的一个单文件中。这些文件最终会通过 JS 打包或构建工具(例如 Webpack、Vite)处理。
.
<template>
元素包含了所有的标记结构和组件的展示逻辑。template 可以包含任何合法的 HTML,以及 Vue 特定的语法。通过设置<template>
标签的lang
属性,例如可以通过设置<template lang="pug">
就可以在使用 Pug 模板来替代标准 HTML。而 .vue 文件中的
<script>
标签包含组件中所有的非显示逻辑,并且需要默认导出一个 JS 对象。该对象是在本地注册组件、定义属性、处理本地状态、定义方法等的地方。在构建阶段这个包含了 template 模板的对象会被处理和转换成为一个有 render() 函数的 Vue 组件。组件的 CSS 样式写在
<style>
标签里,如果添加了scoped
属性,Vue 会把样式的范围限制到单文件组件的内容里。这是类似于 CSS-in-JS 的解决方案,只不过允许书写纯粹的 CSS。如果通过 CLI 创建项目时选择了 CSS 预处理器,则可以将lang
属性添加到<style>
사실 JSX는 React.createElement(comComponent, props, ...children) 함수에 대한 구문 설탕일 뿐입니다. React.createElement()를 사용하여 UI를 직접 작성하면 컴파일 단계를 건너뛸 수 있습니다. 그러나 그렇게 하면 JSX의 선언적 이점이 사라지고 코드를 읽기가 더 어려워집니다. 컴파일은 개발 프로세스의 추가 단계이지만 React 커뮤니티의 많은 개발자는 JSX의 가독성이 그만한 가치가 있다고 믿습니다. 또한 널리 사용되는 도구를 사용하면 JSX-to-JavaScript 컴파일이 설정 프로세스의 일부가 됩니다. 원하지 않는 한 컴파일을 직접 구성할 필요는 없습니다. 특정 JSX가 어떤 종류의 JavaScript로 변환되는지 테스트하려면 온라인 바벨 컴파일러npm i @vitejs/plugin-vue-jsx -D로그인 후 복사로그인 후 복사
React에는 JSX를 사용할 필요가 없습니다. 빌드 환경에서 JSX 컴파일을 구성하지 않으려는 경우 React에서 JSX를 사용하지 않는 것이 더 편리합니다. 예를 들어 JSX로 작성된 코드:
import vueJsx from "@vitejs/plugin-vue-jsx"; export default defineConfig({ plugins: [ vueJsx(), ] })
import HelloWorld from './HelloWorld.vue' export default { setup() { return () => <HelloWorld msg="11" />; }, };
🎜Using JSX in Vue3🎜🎜🎜Vue는 단일 파일 구성 요소를 사용하고 템플릿 템플릿을 넣습니다. 관련 스크립트와 CSS는 .vue로 끝나는 단일 파일에 함께 통합됩니다. 이러한 파일은 궁극적으로 JS 패키징 또는 빌드 도구(예: Webpack, Vite)에 의해 처리됩니다. 🎜🎜<template>
요소에는 모든 마크업 구조와 구성 요소 표시 논리가 포함되어 있습니다. 템플릿에는 유효한 HTML과 Vue 관련 구문이 포함될 수 있습니다. 예를 들어 <template>
태그의 lang
속성을 설정하면 <template lang="pug"><를 설정하여 사용할 수 있습니다. /code> 표준 HTML을 대체하는 Pug 템플릿입니다. 🎜🎜.vue 파일의 <script>
태그에는 구성 요소의 모든 비표시 로직이 포함되어 있으며 기본적으로 JS 개체를 내보내야 합니다. 이 객체는 구성 요소가 로컬로 등록되고, 속성이 정의되고, 로컬 상태가 처리되고, 메서드가 정의되는 곳입니다. 빌드 단계 동안 템플릿을 포함하는 이 객체는 처리되어 render() 함수를 사용하여 Vue 구성 요소로 변환됩니다. 🎜🎜구성 요소의 CSS 스타일은 <style>
태그에 작성됩니다. scoped
속성이 추가되면 Vue는 스타일 범위를 콘텐츠로 제한합니다. 단일 파일 구성 요소의. 이는 CSS-in-JS와 유사한 솔루션이지만 순수한 CSS 작성을 허용합니다. CLI를 통해 프로젝트를 생성할 때 CSS 전처리기를 선택한 경우 Webpack이 빌드 시 콘텐츠를 처리할 수 있도록 <style>
태그에 lang
속성을 추가할 수 있습니다. 시간. 🎜🎜🎜jsx는 React에서 처음 도입되었지만 실제로 JSX 구문은 런타임 의미 체계를 정의하지 않으며 다양한 출력 형식으로 컴파일될 수 있습니다. 이전에 JSX 구문을 사용한 적이 있다면 🎜Vue의 JSX 컴파일 방법이 React🎜의 JSX 컴파일 방법과 다르기 때문에 Vue 애플리케이션에서 React의 JSX 컴파일을 사용할 수 없다는 점에 유의하세요. React JSX 구문과의 몇 가지 주목할만한 차이점은 다음과 같습니다. 🎜- 可以使用 HTML attributes 比如
class
和 for
作为 props - 不需要使用 className
或 htmlFor
。 - 传递子元素给组件 (比如 slots) 的方式不同。
Vue 的类型定义也提供了 TSX 语法的类型推导支持。当使用 TSX 语法时,确保在 tsconfig.json
中配置了 "jsx": "preserve"
,这样的 TypeScript 就能保证 Vue JSX 语法编译过程中的完整性。
安装插件(@vitejs/plugin-vue-jsx)
vite 官方提供了官方的插件来支持在 vue3 中使用 jsx/tsx,直接安装就行。
npm i @vitejs/plugin-vue-jsx -D
로그인 후 복사로그인 후 복사安装完之后在 vite.config.js 文件中的 plugins 字段中添加 jsx 支持:
import vueJsx from "@vitejs/plugin-vue-jsx";
export default defineConfig({
plugins: [
vueJsx(),
]
})
로그인 후 복사로그인 후 복사这样就可以在项目中使用 jsx/tsx 了。
新建 jsx 文件
在项目中新建 jsx 或 tsx 后缀的文件,语法和 js 文件类似,但是和 .vue 文件中的 <script>
标签一样需要默认导出一个 JS 对象。该对象是在本地注册组件、定义属性、处理本地状态、定义方法等的地方。
import HelloWorld from './HelloWorld.vue'
export default {
setup() {
return () => <HelloWorld msg="11" />;
},
};
로그인 후 복사로그인 후 복사语法
1、插值。与 vue 模板语法中的插值一样,但是双大括号 {{}} 变为了单大括号 {}。大括号内支持任何有效的 JavaScript 表达式,比如:2 + 2,user.firstName,formatName(user) 等。
// 模板语法
<span>{{ a + b }}</span>
// jsx/tsx
<span>{ a + b }</span>
로그인 후 복사2、class 类名绑定。有两种方式,使用模板字符串或者使用数组。
// 模板字符串
<div className={ `header ${ isBg ? 'headerBg' : '' }` }>header</div>
// 数组
<div class={ [ 'header', isBg && 'headerBg' ] } >header</div>
로그인 후 복사3、style 样式绑定。需要使用双大括号。
const color = 'red'
const element = <sapn style={{ color, fontSize: '16px' }}>style</sapn>
로그인 후 복사4、条件渲染。由于 jsx 本身具有 js 语法,所以不再需要使用 v-if 指令,使用 if/else 和三元表达式都可以实现。但是支持 v-show 指令。
const element = (name) => {
if (name) {
return <h1>Hello, { name }</h1>
} else {
return <h1>Hello, Stranger</h1>
}
}
const element = icon ? <span class="icon"></span> : null;
// 以上代码等效于:
const element = icon && <span class="icon"></span>;
로그인 후 복사5、列表渲染。同样,由于 jsx 本身具有 js 语法,所以不再需要使用 v-for 指令,使用 JS 数组的 map 方法即可。
const listData = [
{name: 'Tom', age: 18},
{name: 'Jim', age: 20},
{name: 'Lucy', age: 16}
]
return () => (
<div>
<div class={'box'}>
<span>姓名</span>
<span>年龄</span>
</div>
{
prop.listData.map(item => <div class={'box'}>
<span>{item.name}</span>
<span>{item.age}</span>
</div>
})
</div>
)
로그인 후 복사6、标签属性绑定。也是使用大括号包裹,不能使用 v-bind 指令。而 vue 组件中通过 <div v-bind="properties"></div>
批量绑定标签属性,在 JSX 中需要使用 <div {...properties}></div>
。
const href = 'https://cn.vuejs.org/'
const element = <a href={href}>Vue3</a>
로그인 후 복사7、事件绑定。使用的也是 单大括号 {},不过事件绑定不是以 @为前缀了,而是改成了 on,与原生相同。例如:click 事件是 onClick 或 onclick。
const confirm = () => {
// 确认提交
}
<button onClick={confirm}>确定</button>
로그인 후 복사如果要带参数,需要使用箭头函数进行包裹:
const confirm = (name) => {
// 确认提交
}
<button onClick={() => confirm('Are you sure')}>确定</button>
로그인 후 복사8、事件修饰符。需要使用 withModifiers 方法,接收两个参数,第一个参数是绑定的事件,第二个参数是需要使用的事件修饰符。
import { withModifiers, defineComponent, ref } from 'vue'
const App = defineComponent({
setup() {
const count = ref(0);
const inc = () => {
count.value++;
};
return () => (
<div onClick={ withModifiers(inc, ['self']) }>{ count.value }</div>
);
},
})
export default App
로그인 후 복사注意:Vue 模板中 ref 变量是可以直接解构的,但是在 jsx 中不行,需要添加 .value,比如上面的 { count.value }。
9、v-model 双向绑定。需要使用单大括号 {}。如果绑定属性则需要一个数组,第一个元素为绑定的值,第二个元素为绑定的属性。
// 绑定值
<input v-model="show" /> // vue
<input v-model={show.value} /> // jsx
// 绑定属性
<input v-model:prop="show" /> // vue
<input v-model={[show.value,'prop']} /> // jsx
// 修饰符写法
<input v-model:prop.trim="show" /> // vue
<input v-model={[show.value,'prop',['trim']]} /> // jsx
로그인 후 복사10、slot 插槽。jsx/tsx 中无法使用 slot 标签,定义插槽方式一:通过 setup 函数的第一个参数 ctx 上下文对象的 slots 的属性,setup 函数默认接收两个参数:
- props - 组件传入的参数对象。
- ctx - 上下文对象,上下文对象暴露了其他一些在 setup 中可能会用到的值,包括:
- attrs - 透传的 Attributes(非响应式的对象,等价于 $attrs)。
- slots - 插槽(非响应式的对象,等价于 $slots)。
- emit - 触发事件的函数(等价于 $emit)。
- expose - 暴露公共属性的函数。
如果解构了 props
对象,解构出的变量将会丢失响应性,因此推荐通过 props.xxx
的形式来使用其中的 props。如果确实需要解构 props
对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,可以使用 toRefs() 和 toRef() 这两个工具函数:
import { toRefs, toRef } from 'vue'
export default {
setup(props) {
// 将 `props` 转为一个其中全是 ref 的对象,然后解构
const { title } = toRefs(props)
// `title` 是一个追踪着 `props.title` 的 ref
console.log(title.value)
// 或者,将 `props` 的单个属性转为一个 ref
const title = toRef(props, 'title')
}
}
로그인 후 복사ctx 上下文对象是非响应式的,可以安全地解构:
export default {
setup(props, { attrs, slots, emit, expose }) {
...
}
}
로그인 후 복사attrs 和 slots 都是响应式(有状态)的对象,它们总是会随着组件自身的更新而更新。这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。此外,和 props 不同,attrs 和 slots 的属性都不是响应式的。如果想要基于 attrs 或 slots 的改变来执行副作用,那么应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。
expose 函数用于显式地限制该组件暴露出的属性,当父组件通过模板引用访问该组件的实例时,将仅能访问 expose 函数暴露出的内容:
export default {
setup(props, { expose }) {
// 让组件实例处于 “关闭状态”
// 即不向父组件暴露任何东西
expose()
const publicCount = ref(0)
const privateCount = ref(0)
// 有选择地暴露局部状态
expose({ count: publicCount })
}
}
로그인 후 복사通过 ctx 上下文对象的 slots 的属性可以获取插槽对象后,就可以定义插槽了。
import { defineComponent } from 'vue'
export default defineComponent({
setup(props, { slots }) { // 逻辑
return () => {
return <p>
<button>{ slots.test?.() }</button>
<button>{ slots.default?.() }</button>
</p>
}
},
})
// 在引用的组件中
<template #test>slot-test</template>
<template #>slot-default</template>
로그인 후 복사定义插槽方式二:使用 renderSlot 函数。
import { renderSlot } from 'vue'
<button>
{ renderSlot(slots, 'default') }
</button>
로그인 후 복사而如果在 jsx 中使用插槽,可以直接通过标签属性 slot,或通过 v-slots 指令。
import HelloWorld from './HelloWorld'
export default defineComponent({
setup() {
return () => (
<div class={'box'}>
<HelloWorld v-slots={{
title: () => {
return <p>我是title插槽</p>
},
default: () => {
return <p>我是default插槽</p>
}
}} />
</div>
)
}
})
로그인 후 복사11、CSS Modules。引入局部样式,相当于 vue 组件中 <style>
标签的 scoped 属性。
import styles from './index.module.scss'
<div class={styles.wrap}></div>
로그인 후 복사GitHub 源码
위 내용은 Vue3+Vite에서 JSX를 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
<template>
요소에는 모든 마크업 구조와 구성 요소 표시 논리가 포함되어 있습니다. 템플릿에는 유효한 HTML과 Vue 관련 구문이 포함될 수 있습니다. 예를 들어 <template>
태그의 lang
속성을 설정하면 <template lang="pug"><를 설정하여 사용할 수 있습니다. /code> 표준 HTML을 대체하는 Pug 템플릿입니다. 🎜🎜.vue 파일의 <script>
태그에는 구성 요소의 모든 비표시 로직이 포함되어 있으며 기본적으로 JS 개체를 내보내야 합니다. 이 객체는 구성 요소가 로컬로 등록되고, 속성이 정의되고, 로컬 상태가 처리되고, 메서드가 정의되는 곳입니다. 빌드 단계 동안 템플릿을 포함하는 이 객체는 처리되어 render() 함수를 사용하여 Vue 구성 요소로 변환됩니다. 🎜🎜구성 요소의 CSS 스타일은 <style>
태그에 작성됩니다. scoped
속성이 추가되면 Vue는 스타일 범위를 콘텐츠로 제한합니다. 단일 파일 구성 요소의. 이는 CSS-in-JS와 유사한 솔루션이지만 순수한 CSS 작성을 허용합니다. CLI를 통해 프로젝트를 생성할 때 CSS 전처리기를 선택한 경우 Webpack이 빌드 시 콘텐츠를 처리할 수 있도록 <style>
태그에 lang
속성을 추가할 수 있습니다. 시간. 🎜🎜🎜jsx는 React에서 처음 도입되었지만 실제로 JSX 구문은 런타임 의미 체계를 정의하지 않으며 다양한 출력 형식으로 컴파일될 수 있습니다. 이전에 JSX 구문을 사용한 적이 있다면 🎜Vue의 JSX 컴파일 방법이 React🎜의 JSX 컴파일 방법과 다르기 때문에 Vue 애플리케이션에서 React의 JSX 컴파일을 사용할 수 없다는 점에 유의하세요. React JSX 구문과의 몇 가지 주목할만한 차이점은 다음과 같습니다. 🎜- 可以使用 HTML attributes 比如
class
和 for
作为 props - 不需要使用 className
或 htmlFor
。 - 传递子元素给组件 (比如 slots) 的方式不同。
Vue 的类型定义也提供了 TSX 语法的类型推导支持。当使用 TSX 语法时,确保在 tsconfig.json
中配置了 "jsx": "preserve"
,这样的 TypeScript 就能保证 Vue JSX 语法编译过程中的完整性。
安装插件(@vitejs/plugin-vue-jsx)
vite 官方提供了官方的插件来支持在 vue3 中使用 jsx/tsx,直接安装就行。
npm i @vitejs/plugin-vue-jsx -D
로그인 후 복사로그인 후 복사安装完之后在 vite.config.js 文件中的 plugins 字段中添加 jsx 支持:
import vueJsx from "@vitejs/plugin-vue-jsx";
export default defineConfig({
plugins: [
vueJsx(),
]
})
로그인 후 복사로그인 후 복사这样就可以在项目中使用 jsx/tsx 了。
新建 jsx 文件
在项目中新建 jsx 或 tsx 后缀的文件,语法和 js 文件类似,但是和 .vue 文件中的 <script>
标签一样需要默认导出一个 JS 对象。该对象是在本地注册组件、定义属性、处理本地状态、定义方法等的地方。
import HelloWorld from './HelloWorld.vue'
export default {
setup() {
return () => <HelloWorld msg="11" />;
},
};
로그인 후 복사로그인 후 복사语法
1、插值。与 vue 模板语法中的插值一样,但是双大括号 {{}} 变为了单大括号 {}。大括号内支持任何有效的 JavaScript 表达式,比如:2 + 2,user.firstName,formatName(user) 等。
// 模板语法
<span>{{ a + b }}</span>
// jsx/tsx
<span>{ a + b }</span>
로그인 후 복사2、class 类名绑定。有两种方式,使用模板字符串或者使用数组。
// 模板字符串
<div className={ `header ${ isBg ? 'headerBg' : '' }` }>header</div>
// 数组
<div class={ [ 'header', isBg && 'headerBg' ] } >header</div>
로그인 후 복사3、style 样式绑定。需要使用双大括号。
const color = 'red'
const element = <sapn style={{ color, fontSize: '16px' }}>style</sapn>
로그인 후 복사4、条件渲染。由于 jsx 本身具有 js 语法,所以不再需要使用 v-if 指令,使用 if/else 和三元表达式都可以实现。但是支持 v-show 指令。
const element = (name) => {
if (name) {
return <h1>Hello, { name }</h1>
} else {
return <h1>Hello, Stranger</h1>
}
}
const element = icon ? <span class="icon"></span> : null;
// 以上代码等效于:
const element = icon && <span class="icon"></span>;
로그인 후 복사5、列表渲染。同样,由于 jsx 本身具有 js 语法,所以不再需要使用 v-for 指令,使用 JS 数组的 map 方法即可。
const listData = [
{name: 'Tom', age: 18},
{name: 'Jim', age: 20},
{name: 'Lucy', age: 16}
]
return () => (
<div>
<div class={'box'}>
<span>姓名</span>
<span>年龄</span>
</div>
{
prop.listData.map(item => <div class={'box'}>
<span>{item.name}</span>
<span>{item.age}</span>
</div>
})
</div>
)
로그인 후 복사6、标签属性绑定。也是使用大括号包裹,不能使用 v-bind 指令。而 vue 组件中通过 <div v-bind="properties"></div>
批量绑定标签属性,在 JSX 中需要使用 <div {...properties}></div>
。
const href = 'https://cn.vuejs.org/'
const element = <a href={href}>Vue3</a>
로그인 후 복사7、事件绑定。使用的也是 单大括号 {},不过事件绑定不是以 @为前缀了,而是改成了 on,与原生相同。例如:click 事件是 onClick 或 onclick。
const confirm = () => {
// 确认提交
}
<button onClick={confirm}>确定</button>
로그인 후 복사如果要带参数,需要使用箭头函数进行包裹:
const confirm = (name) => {
// 确认提交
}
<button onClick={() => confirm('Are you sure')}>确定</button>
로그인 후 복사8、事件修饰符。需要使用 withModifiers 方法,接收两个参数,第一个参数是绑定的事件,第二个参数是需要使用的事件修饰符。
import { withModifiers, defineComponent, ref } from 'vue'
const App = defineComponent({
setup() {
const count = ref(0);
const inc = () => {
count.value++;
};
return () => (
<div onClick={ withModifiers(inc, ['self']) }>{ count.value }</div>
);
},
})
export default App
로그인 후 복사注意:Vue 模板中 ref 变量是可以直接解构的,但是在 jsx 中不行,需要添加 .value,比如上面的 { count.value }。
9、v-model 双向绑定。需要使用单大括号 {}。如果绑定属性则需要一个数组,第一个元素为绑定的值,第二个元素为绑定的属性。
// 绑定值
<input v-model="show" /> // vue
<input v-model={show.value} /> // jsx
// 绑定属性
<input v-model:prop="show" /> // vue
<input v-model={[show.value,'prop']} /> // jsx
// 修饰符写法
<input v-model:prop.trim="show" /> // vue
<input v-model={[show.value,'prop',['trim']]} /> // jsx
로그인 후 복사10、slot 插槽。jsx/tsx 中无法使用 slot 标签,定义插槽方式一:通过 setup 函数的第一个参数 ctx 上下文对象的 slots 的属性,setup 函数默认接收两个参数:
- props - 组件传入的参数对象。
- ctx - 上下文对象,上下文对象暴露了其他一些在 setup 中可能会用到的值,包括:
- attrs - 透传的 Attributes(非响应式的对象,等价于 $attrs)。
- slots - 插槽(非响应式的对象,等价于 $slots)。
- emit - 触发事件的函数(等价于 $emit)。
- expose - 暴露公共属性的函数。
如果解构了 props
对象,解构出的变量将会丢失响应性,因此推荐通过 props.xxx
的形式来使用其中的 props。如果确实需要解构 props
对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,可以使用 toRefs() 和 toRef() 这两个工具函数:
import { toRefs, toRef } from 'vue'
export default {
setup(props) {
// 将 `props` 转为一个其中全是 ref 的对象,然后解构
const { title } = toRefs(props)
// `title` 是一个追踪着 `props.title` 的 ref
console.log(title.value)
// 或者,将 `props` 的单个属性转为一个 ref
const title = toRef(props, 'title')
}
}
로그인 후 복사ctx 上下文对象是非响应式的,可以安全地解构:
export default {
setup(props, { attrs, slots, emit, expose }) {
...
}
}
로그인 후 복사attrs 和 slots 都是响应式(有状态)的对象,它们总是会随着组件自身的更新而更新。这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。此外,和 props 不同,attrs 和 slots 的属性都不是响应式的。如果想要基于 attrs 或 slots 的改变来执行副作用,那么应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。
expose 函数用于显式地限制该组件暴露出的属性,当父组件通过模板引用访问该组件的实例时,将仅能访问 expose 函数暴露出的内容:
export default {
setup(props, { expose }) {
// 让组件实例处于 “关闭状态”
// 即不向父组件暴露任何东西
expose()
const publicCount = ref(0)
const privateCount = ref(0)
// 有选择地暴露局部状态
expose({ count: publicCount })
}
}
로그인 후 복사通过 ctx 上下文对象的 slots 的属性可以获取插槽对象后,就可以定义插槽了。
import { defineComponent } from 'vue'
export default defineComponent({
setup(props, { slots }) { // 逻辑
return () => {
return <p>
<button>{ slots.test?.() }</button>
<button>{ slots.default?.() }</button>
</p>
}
},
})
// 在引用的组件中
<template #test>slot-test</template>
<template #>slot-default</template>
로그인 후 복사定义插槽方式二:使用 renderSlot 函数。
import { renderSlot } from 'vue'
<button>
{ renderSlot(slots, 'default') }
</button>
로그인 후 복사而如果在 jsx 中使用插槽,可以直接通过标签属性 slot,或通过 v-slots 指令。
import HelloWorld from './HelloWorld'
export default defineComponent({
setup() {
return () => (
<div class={'box'}>
<HelloWorld v-slots={{
title: () => {
return <p>我是title插槽</p>
},
default: () => {
return <p>我是default插槽</p>
}
}} />
</div>
)
}
})
로그인 후 복사11、CSS Modules。引入局部样式,相当于 vue 组件中 <style>
标签的 scoped 属性。
import styles from './index.module.scss'
<div class={styles.wrap}></div>
로그인 후 복사GitHub 源码
위 내용은 Vue3+Vite에서 JSX를 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











HTML 템플릿의 버튼을 메소드에 바인딩하여 VUE 버튼에 함수를 추가 할 수 있습니다. 메소드를 정의하고 VUE 인스턴스에서 기능 로직을 작성하십시오.

vue.js에서 bootstrap 사용은 5 단계로 나뉩니다 : Bootstrap 설치. main.js.의 부트 스트랩 가져 오기 부트 스트랩 구성 요소를 템플릿에서 직접 사용하십시오. 선택 사항 : 사용자 정의 스타일. 선택 사항 : 플러그인을 사용하십시오.

vue.js에서 JS 파일을 참조하는 세 가지 방법이 있습니다. & lt; script & gt; 꼬리표;; mounted () 라이프 사이클 후크를 사용한 동적 가져 오기; Vuex State Management Library를 통해 수입.

vue.js의 시계 옵션을 사용하면 개발자가 특정 데이터의 변경 사항을들을 수 있습니다. 데이터가 변경되면 콜백 기능을 트리거하여 업데이트보기 또는 기타 작업을 수행합니다. 구성 옵션에는 즉시 콜백을 실행할지 여부와 DEEP를 지정하는 즉시 포함되며, 이는 객체 또는 어레이에 대한 변경 사항을 재귀 적으로 듣는 지 여부를 지정합니다.

vue.js는 이전 페이지로 돌아갈 수있는 네 가지 방법이 있습니다. $ router.go (-1) $ router.back () 사용 & lt; router-link to = & quot;/quot; Component Window.history.back () 및 메소드 선택은 장면에 따라 다릅니다.

CSS 애니메이션 또는 타사 라이브러리를 사용하여 VUE에서 Marquee/Text Scrolling Effects를 구현하십시오. 이 기사는 CSS 애니메이션 사용 방법을 소개합니다. & lt; div & gt; CSS 애니메이션을 정의하고 오버플로를 설정하십시오 : 숨겨진, 너비 및 애니메이션. 키 프레임을 정의하고 변환을 설정하십시오 : Translatex () 애니메이션의 시작과 끝에서. 지속 시간, 스크롤 속도 및 방향과 같은 애니메이션 속성을 조정하십시오.

Pagination은 큰 데이터 세트를 작은 페이지로 나누어 성능 및 사용자 경험을 향상시키는 기술입니다. VUE에서 다음 내장 방법을 페이징에 사용할 수 있습니다. 총 페이지 수를 계산하십시오 : TotalPages () Traversal 페이지 번호 : V-For Directive 현재 페이지를 설정하려면 : CurrentPage 현재 페이지 데이터 가져 오기 : currentPagedAta ()

VUE의 기능 차단은 지정된 기간 내에 기능이 호출되는 횟수를 제한하고 성능 문제를 방지하는 데 사용되는 기술입니다. 구현 방법은 다음과 같습니다. lodash 라이브러리 가져 오기 : 'lodash'에서 import {debounce}; Debounce 기능을 사용하여 인터셉트 기능을 만듭니다. const debouncedfunction = debounce (() = & gt; { / logical /}, 500); 인터셉트 함수를 호출하면 제어 기능이 최대 500 밀리 초 안에 한 번 호출됩니다.
