Vue가 JSX를 통해 구성 요소를 동적으로 렌더링하는 방법에 대해 이야기해 보겠습니다.
Vue는 어떻게 JSX를 통해 구성 요소를 동적으로 렌더링합니까? 다음 기사에서는 Vue가 JSX를 통해 구성 요소를 효율적으로 동적으로 렌더링하는 방법을 소개합니다. 도움이 되기를 바랍니다.
1. 명확한 요구 사항
동적 구성 요소를 렌더링하는 방법은 무엇입니까? [관련 권장 사항: vuejs 비디오 튜토리얼]
다음과 같은 배열 구조 집합이 있습니다.
1 2 3 4 5 |
|
arr을 반복하여 tag
렌더링에 해당하는 구성 요소를 가져오고 싶습니다. tag
渲染对应的组件。
下面我们分析如何写才是最优。
二、进行分析
2.1 v-if走天下
我们可以写一个v-for
去循环arr数组,然后通过v-if
去判断tag,渲染对应的组件类型。
这样子写不是不可以,只不过扩展性不好,每次加一个标签,模板就要再加一个v-if。
我相信很多人起初都是这样写。
但这不是我们优雅人该写的代码。
2.2 动态渲染组件标签
我们能不能根据tag
的标签来渲染出真正的标签。
关键是循环内,怎么根据遍历的tag去渲染出真正的组件。
1 2 3 |
|
有请今天的主角JSX上场。
2.3 JSX动态渲染组件
父组件
1 2 3 4 5 6 7 8 9 10 |
|
子组件RendTag.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
|
我们利用JSX的render
可以写JavaScript返回组件,来实现我们动态渲染标签。
render
相当于我们vue中的模板。
于是渲染出的效果如下:根据tag渲染成真正的组件
我们用普通的组件,无法像JSX一样渲染成我们想要的组件。
这里的v-model
用计算属性的坑,我推荐看一遍:实战v-model如何绑定多循环表达式(内含原理)
其实这两篇是有一定的挂钩的,只不过我在这里拆开了需求。
主要也是方便朋友们阅读理解。
三、vue中如何使用JSX
借着该需求,我们恶补一下JSX。
3.1 是什么?
JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML
,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javascript 的灵活性,同时又兼具 html 的语义化和直观性。
活度强的部分组件可以用JSX来代替(比如以上需求);
整个工程没有必要都使用JSX。
3.2 基本用法
3.2.1 函数式组件
我们在组件中,也可以嵌入ButtonCounter组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
3.2.2 普通属性、行内样式、动态class与style
可以看到,其实和vue的模板写法基本一致,只不过要注意的是花括号;
在vue的模板是要写两对花括号,而在JSX
只需要写一对。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
3.2.3 常用指令
v-html、v-if、v-for、v-model常用指令在JSX中无法使用,需要使用其他方式来实现。
v-html
在JSX中,如果要设置DOM的innerHTML
,需要用到domProps
。
组件使用:
1 2 3 |
|
组件代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
渲染DOM结果:
v-for
使用map
来实现:
1 2 3 4 5 6 7 8 |
|
v-if
简单示例:用三元
1 2 3 4 |
|
复杂示例:直接用JS
1 2 3 4 5 6 |
|
v-model
直接使用:<input v-model={this.value}>

아래 최적의 글쓰기 방법을 분석합니다.
둘째, 분석하기2.1 v-if로 전 세계를 여행한다면
< code>v-for는 arr 배열을 반복한 다음 v-if
를 사용하여 태그를 결정하고 해당 구성요소 유형을 렌더링합니다.
🎜2.2 구성 요소 태그를 동적으로 렌더링🎜
🎜tag
의 태그를 기반으로 실제 태그를 렌더링할 수 있나요? 🎜🎜핵심은 루프 내에서 탐색된 태그를 기반으로 실제 구성 요소를 렌더링하는 방법입니다. 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|

🎜2.3 JSX 동적 렌더링 구성 요소🎜
🎜상위 구성 요소🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
render
를 사용하여 JavaScript를 작성할 수 있습니다. 태그의 동적 렌더링을 구현하는 구성요소입니다. 🎜🎜render
는 우리 vue의 템플릿과 동일합니다. 🎜🎜그래서 렌더링 효과는 다음과 같습니다: 태그에 따라 실제 구성 요소로 렌더링됩니다🎜🎜v-model
은 계산된 속성을 사용합니다. 실용적인 v-model 다중 루프 표현식 바인딩 방법(원리 포함)🎜🎜🎜사실 이 두 글은 어느 정도 관련이 있지만 요구 사항을 세분화했습니다. 여기. 🎜🎜주로 친구들의 읽기와 이해를 돕기 위한 것입니다. 🎜3. vue에서 JSX를 사용하는 방법🎜🎜이러한 요구를 JSX로 보완하겠습니다. 🎜
🎜3.1이란 무엇인가요? 🎜
🎜JSX는 Javascript의 구문 확장인JSX = Javascript + XML
입니다. 이는 Javascript로 XML을 작성한다는 의미입니다. JSX의 이러한 기능으로 인해 Javascript의 유연성을 가지게 됩니다. HTML의 의미와 직관성. 🎜🎜활동성이 강한 일부 구성 요소는 JSX로 대체될 수 있습니다(예: 위의 요구 사항).
전체 프로젝트에 JSX를 사용할 필요는 없습니다. 🎜
🎜3.2 기본 사용법🎜
🎜3.2.1 기능 구성 요소🎜🎜🎜현재 위치 구성 요소에는 ButtonCounter 구성 요소가 포함될 수도 있습니다. 🎜1
2
3
4
5
<input
type=
"text"
value={this.value}
onInput={(e) => (this.vaue = e.target.value)}
/>
로그인 후 복사로그인 후 복사
1 2 3 4 5 |
|
🎜3.2.2 공통 속성, 인라인 스타일, 동적 클래스 및 스타일🎜🎜🎜 보시다시피 기본적으로 Vue의 템플릿 작성 방법과 동일하지만, 🎜🎜vue 템플릿에서는 두 쌍의 중괄호를 작성해야 하지만 JSX
에서는 🎜한 쌍🎜만 작성하면 됩니다. 🎜1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
export
default
{
name:
"HelloWorld"
,
props: {
msg: String
},
data() {
return
{
value:
""
};
},
watch: {
value(val) {
console.log(
"this.model的内容:"
+ val);
}
},
methods: {
handleInput(e) {
this.value = e.target.value;
},
handleFocus(e) {
console.log(e.target);
}
},
render() {
return
(
<div>
<input type=
"text"
value={this.value} {...{ on: { input: this.handleInput, focus: this.handleFocus } }} />
</div>
);
}
};
로그인 후 복사로그인 후 복사🎜
🎜< h4 data-id="heading-11">🎜3.2.3 공통 명령어 🎜🎜🎜v-html, v-if, v-for, v-model 공통 명령어는 JSX에서 사용할 수 없으며 다른 방법으로 구현해야 합니다. . 🎜🎜🎜v-html🎜🎜🎜JSX에서 DOM의 innerHTML
을 설정하려면 domProps
를 사용해야 합니다. Component Usage : 🎜1
{...{nativeOn:{click: this.handleClick}}}
로그인 후 복사로그인 후 복사e🎜component 코드 : 🎜1
2
3
if
(event.target !== event.currentTarget){
return
}
로그인 후 복사로그인 후 복사🎜rendered dom 결과 : 🎜🎜
🎜🎜🎜v-for🎜🎜🎜map
을 사용하여 구현: 🎜1
2
3
if
(event.keyCode === 13) {
// 执行逻辑
}
로그인 후 복사로그인 후 복사🎜🎜v-if🎜🎜🎜간단한 예: 사용 삼항 🎜1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
export
default
{
name:
"HelloWorld"
,
props: {
msg: String
},
methods: {
handleClick(e) {
console.log(
"click事件:"
+ e.target);
},
handleInput(e) {
console.log(
"input事件:"
+ e.target);
},
handleMouseDown(e) {
console.log(
"mousedown事件:"
+ e.target);
},
handleMouseUp(e) {
console.log(
"mouseup事件"
+ e.target);
}
},
render() {
return
(
<div
{...{
on: {
// 相当于 :click.capture
"!click"
: this.handleClick,
// 相当于 :input.once
"~input"
: this.handleInput,
// 相当于 :mousedown.passive
"&mousedown"
: this.handleMouseDown,
// 相当于 :mouseup.capture.once
"~!mouseup"
: this.handleMouseUp
}
}}
>
点击模块
</div>
);
}
};
로그인 후 복사로그인 후 복사🎜복잡한 예: JS🎜1
2
3
4
5
6
7
<HelloWorld>
<template slot=
"default"
>默认内容</template>
<template slot=
"footer"
>
<el-button type=
"primary"
>确定</el-button>
<el-button>取消</el-button>
</template>
</HelloWorld>
로그인 후 복사로그인 후 복사🎜🎜v-model🎜🎜🎜직접 사용: <input v-model={this.value}>
🎜1
2
3
4
5
6
7
8
9
10
11
export
default
{
name:
"HelloWorld"
,
render() {
return
(
<div>
<div
class
=
"default"
>{this.
$slots
.
default
}</div>
<div
class
=
"footer"
>{this.
$slots
.footer}</div>
</div>
);
}
};
로그인 후 복사로그인 후 복사🎜🎜3.2 . 4 Listening events and event modifiers🎜🎜🎜🎜Listening events🎜🎜🎜onChange, onClick 등을 사용하여 이벤트를 수신하는 것을 생각합니다. 🎜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
1 |
|
1 2 3 |
|
1 2 3 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
需要注意的是,传参数不能使用 onClick={this.handleClick(params)}
,这样子会每次 render
的时候都会自动执行一次方法。
应该使用bind
,或者箭头函数
来传参。
组件示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
用监听事件来实现v-model
:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
也可以调整为:
1 2 3 4 5 |
|
还可以使用对象的方式去监听事件:解构事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
nativeOn
仅对于组件,用于监听原生事件,也可以使用对象的方式去监听事件:
1 |
|
事件修饰符
和指令一样,除了个别的之外,大部分的事件修饰符都无法在JSX中使用。
- .stop : 阻止事件冒泡,在JSX中使用
event.stopPropagation()
来代替 - .prevent:阻止默认行为,在JSX中使用
event.preventDefault()
来代替 - .self:只当事件是从侦听器绑定的元素本身触发时才触发回调,使用下面的条件判断进行代替
1 2 3 |
|
.enter与keyCode
: 在特定键触发时才触发回调
1 2 3 |
|
除了上面这些修饰符之外,尤大大对于.once,.capture,.passive,.capture.once做了优化,简化代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
3.3 插槽
3.3.1 普通插槽与具名插槽
父传子。
示例:
1 2 3 4 5 6 7 |
|
HelloWorld组件代码:this.$slots
1 2 3 4 5 6 7 8 9 10 11 |
|
3.3.2 作用域插槽
子传父。
示例:
1 2 3 4 5 6 |
|
HelloWorld组件代码:this.$scopedSlots
1 2 3 4 5 6 7 8 9 10 |
|
子组件通过{this.$scopedSlots.content({ name: "张三", age: 20 })}
指定插槽的名称为content
,并将含有name,age属性的对象数据传递给父组件,父组件就可以在插槽内容中使用子组件传递来的数据。
看到v-html用innerHTML;v-for用map;.stop用
event.stopPropagation()
。
你有什么感想?
这不就是我们JavaScript方法的操作吗。
所以JSX就是Javascript + XML。
后记
我以前一直觉得Vue中没必要用JSX吧,用模板Template足以了。
但经过这个需求,我想JSX在处理动态渲染组件还是蛮占有优势的?。
日后面试官问我JSX在Vue的有什么应用场景,我想我可以把这个需求说一说。
위 내용은 Vue가 JSX를 통해 구성 요소를 동적으로 렌더링하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











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

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

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

VUE 멀티 페이지 개발은 vue.js 프레임 워크를 사용하여 응용 프로그램을 구축하는 방법입니다. 여기서 응용 프로그램은 별도의 페이지로 나뉩니다. 코드 유지 보수 : 응용 프로그램을 여러 페이지로 분할하면 코드를보다 쉽게 관리하고 유지 관리 할 수 있습니다. 모듈 식 : 각 페이지는 쉬운 재사용 및 교체를 위해 별도의 모듈로 사용할 수 있습니다. 간단한 라우팅 : 페이지 간의 탐색은 간단한 라우팅 구성을 통해 관리 할 수 있습니다. SEO 최적화 : 각 페이지에는 자체 URL이있어 SEO가 도움이됩니다.

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

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

vue.js가 트래버스 어레이 및 객체에 대한 세 가지 일반적인 방법이 있습니다. V- 결합 지시문은 V-FOR와 함께 사용하여 각 요소의 속성 값을 동적으로 설정할 수 있습니다. .MAP 메소드는 배열 요소를 새 배열로 변환 할 수 있습니다.

VUE에서 DIV 요소를 점프하는 두 가지 방법이 있습니다. VUE 라우터를 사용하고 라우터 링크 구성 요소를 추가하십시오. @Click 이벤트 리스너를 추가하고 이것을 호출하십시오. $ router.push () 메소드를 점프하십시오.
