1️⃣ JSX

在 Vue 中使用 JSX 语法。可以让我们回到更接近模板的语法上。

  1. render () {
  2. return (
  3. <h1>这是一个标题</h1>
  4. )
  5. }

image.png

1️⃣ JSX 中使用插值

  1. render () {
  2. return (
  3. <h1>{this.msg}</h1>
  4. )
  5. }

image.png

1️⃣ JSX 中使用指令

在 JSX 中,一些指令并不存在,所以我们可以换一种方式来处理。

2️⃣ v-text

  1. render() {
  2. return <h1 domPropsTextContent="Text 文本"></h1>;
  3. },

image.png

2️⃣ v-html

如果富文本中有图片的话需要样式穿透才可以修改图片的大小,推荐使用 **<style></style>** 来修改图片的大小,不使用 **scoped** 就可以修改组件外的属性

  1. render() {
  2. return <h1 domPropsInnerHTML="<p>InnerHTML</p>"></h1>;
  3. },

image.png

2️⃣ v-show

  1. render() {
  2. return <h1 v-show={this.show}>v-show</h1>;
  3. },

image.png

2️⃣ v-if

3️⃣ 方法一

  1. export default {
  2. data() {
  3. return {
  4. if: true,
  5. };
  6. },
  7. render() {
  8. return (
  9. <div>
  10. {this.if && <h1>v-if</h1>}
  11. {this.if ? <h1>v-if</h1> : <h1>v-else</h1>}
  12. </div>
  13. );
  14. },
  15. };

image.png

3️⃣ 方法二

  1. export default {
  2. data() {
  3. return {
  4. if: 2,
  5. };
  6. },
  7. methods: {
  8. VIf() {
  9. if (this.if === 1) {
  10. return <h1>v-if</h1>;
  11. } else if (this.if === 2) {
  12. return <h1>v-else if</h1>;
  13. } else {
  14. return <h1>v-else</h1>;
  15. }
  16. },
  17. },
  18. render() {
  19. return <div>{this.VIf()}</div>;
  20. },
  21. };

image.png

2️⃣ v-for

  1. render() {
  2. return (
  3. <div>
  4. {[1, 2, 3].map((item) => {
  5. return <li key={item}>{item}</li>;
  6. })}
  7. </div>
  8. );
  9. },

image.png2️⃣ v-on

  1. export default {
  2. data() {
  3. return {};
  4. },
  5. methods: {
  6. handleClick(str) {
  7. console.log("click");
  8. console.log(str); // 不传参时第一个参数为 event
  9. },
  10. },
  11. render() {
  12. return (
  13. <div>
  14. <button onClick={this.handleClick}>小驼峰命名点击事件</button>
  15. <button on-click={this.handleClick}>短横线命名点击事件</button>
  16. <button
  17. onClick={() => {
  18. this.handleClick("string");
  19. }}>
  20. 触发点击时传递参数
  21. </button>
  22. </div>
  23. );
  24. },
  25. };

image.png

2️⃣ v-bind

  1. export default {
  2. data() {
  3. return {
  4. val: "input 数据",
  5. };
  6. },
  7. render() {
  8. return (
  9. <div>
  10. <input value={this.val} />
  11. </div>
  12. );
  13. },
  14. };

image.png
在 JSX 中可以直接使用 class=”xxx” 来指定样式类, 内联样式可以直接写成 style=”xxx”

  1. export default {
  2. data() {
  3. return {};
  4. },
  5. render() {
  6. return (
  7. <div>
  8. <h1 class="a b" style="color:red;">
  9. AAAAA
  10. </h1>
  11. <h1 class={{ a: true, b: false }}>BBBBB</h1>
  12. <h1 style={{ color: "red", fontSize: "30px" }}>CCCCC</h1>
  13. </div>
  14. );
  15. },
  16. };

image.png

2️⃣ v-model

  1. export default {
  2. data() {
  3. return {
  4. val: "v-model 数据",
  5. };
  6. },
  7. render() {
  8. return (
  9. <div>
  10. <input type="text" v-model={this.val} />
  11. {this.val}
  12. </div>
  13. );
  14. },
  15. };

image.png

1️⃣ JSX 中使用 ref

ref 和 for 一起使用时只会有最后一个元素有 ref , 要想让每一个元素有 ref 的话要设置 **refInFor="true"**

  1. export default {
  2. data() {
  3. return {};
  4. },
  5. render() {
  6. return <div ref="div"></div>;
  7. },
  8. mounted() {
  9. console.log(this.$refs);
  10. },
  11. };

image.png

1️⃣ JSX 中使用自定义指令

  1. render () {
  2. // 正常使用方式
  3. return (
  4. <input v-splice={{value: this.value, modifiers: {number: true }}}/>
  5. )
  6. // jsx 中使用方式
  7. const directives = [
  8. {
  9. name: 'splice',
  10. value: this.value,
  11. modifiers: {number: true }
  12. }
  13. ];
  14. return (
  15. <div {...{ directives} }></div>
  16. )
  17. }

1️⃣ JSX 中使用过滤器

  1. <!-- 正常使用过滤器 -->
  2. <div>{{ msg | capitalize }}</div>
  3. <!-- jsx中使用过滤器 -->
  4. <div>{ this.$options.filters('capitalize')(this.msg)}</div>

1️⃣ JSX 中使用插槽

2️⃣ JSX 中使用具名插槽与默认插槽

3️⃣ 模板写法:

  1. <!-- 组件内 -->
  2. <div class="demo">
  3. <slot name="header"></slot>
  4. <slot></slot>
  5. </div>
  6. <!-- 使用时 -->
  7. <my-cmp>
  8. default
  9. <template v-slot:header>header</template>
  10. </my-cmp>

3️⃣ JSX 写法:

  1. export default {
  2. data() {
  3. return {};
  4. },
  5. render() {
  6. return (
  7. <div class="demo">
  8. <h1>{this.$slots.header}</h1>
  9. <h2>{this.$slots.default}</h2>
  10. </div>
  11. );
  12. },
  13. };

image.png

2️⃣ JSX 中使用作用域插槽

3️⃣ 模板写法:

  1. <!-- 组件内 -->
  2. <div class="demo">
  3. <slot :text="'HelloWorld'"></slot>
  4. </div>
  5. <!-- 使用时 -->
  6. <my-cmp v-slot="slotProps"> {{ slotProps.text }} </my-cmp>

3️⃣ JSX 写法:

  1. export default {
  2. data() {
  3. return {};
  4. },
  5. render() {
  6. return (
  7. <div class="demo">
  8. {this.$scopedSlots.default({
  9. text: "HelloWorld",
  10. })}
  11. </div>
  12. );
  13. },
  14. };

image.png