vue-jsx的入门教学(解决业务场景)

379 阅读3分钟

前言,jsx用来解决一些动态的内容,或者条件判断比较麻烦的内容,定制内容会比较方便一些,但是很多人知道有这么个玩意,但是不知道咋用,我最近正好在研究,就写出来大家一起分享一下.(编译需要babel jsx的那个插件官网有例子可以看)

jsx的好处 Vnode可以写在任何地方 可以通过函数来表达,做判断,做逻辑分区,功能分区等等

jsx的坏处 vue所有的事件修饰符都得自己手动实现 不能通过.xxx实现了

1.js里面写的dom 都是VNode 格式大概就是这样的 1-1 VNode的声明

    //这样就声明了一段Vnode 在jsx里面渲染的 都是Vnode 或者是单纯的string,number 如果要渲染Object 
    //需要把对象给toString才能渲染
    const a  = <div>1</div>

1-2 Vnode传参(v2和v3有区别)

    //这个是v3的写法
    import { defineComponent, resolveComponent, ref, h } from "vue";
    import child  from "./child.vue";
    export default defineComponent({
      name: "test",
      components: {
        child
      },
      setup() {
          const testModel = ref("")
          //直接在花括号里面传就完事 
          const a = <child {...{ 
                  modelValue: "",
                  a:2,
                  onClick:()=>{console.log(111)} 
                  }}></child>
        //string 可以直接=号赋值  其他类型都要用花括号包起来代表变量 
        const b = <child 
                    a={2} 
                    c="3" 
                    modelValue={testModel.value} 
                    onClick={()=>{console.log(1111)}}>
                    </child>
        //vue3特殊的update方法
        //因为vue3取消了.sync 可以写错v-model:xxx 这样的写法
        //所以手动实现一个双向绑定需要麻烦一点
        const c=  <child 
                    modelValue={testModel.value} 
                   {...{
                       'onUpdate:modelValue':(v:string)=>{
                       //手动实现双向绑定需要自己监听方法来实现
                       //babel插件有例子可以实现 v-model=[] 这样子 百度搜一下就好
                       //如果是别的什么show啊 都一样 onUpdate:xxx的事件 自己监听就好
                           test.value=v
                       }
                   }}
                   >
                    </child>
        return () => <div class="test"></div>;
      },
     });

下面是vue2的组件传值

import child  from "./child.vue";
export default {
  name: 'test',
  components: {
      child
  },
  data(){
      return {
          testModel:""
      }
  },
  render() {
      //这种方法不加props 组件收不到props
      const a =<child {...{props:{value:"111"}}></child>
      //这个是一样的
      const b =<child value={111}></child>
      //双向绑定可以用插件 可以手动实现 v2的v-model只有一个input事件
      const c =<child value={this.testModel} onInput={(v)=>this.testModel=v}></child>
      //render函数里面必须return 不然页面没东西
      return (
          <div class="test"></div>
      )
  }
}

1-3 循环生成模板 v2 v3都是一样的

    const testArr = [1,2,3]
    //花括号里面是变量 每一个VNode都是唯一的  不能重复
    const a = <div>{testArr.map(v=>{return <span>{v}</span>})}</div>
    //循环绑定v-model
    const b = <div>{testArr.map(v=>{
            return <child value={v} 
            //这样绑定以后 数组里面的值就会被改变
            //v2这个数据就写在data里面  v3就用ref包一层 同时加上.value
            onInput={(value)=>v=value}>
            </child>})}
        </div>

1-4 v-if

    //这个语法是不对  我只是距离子 如果你是写业务的话 
    //v2写在data里面 v3用ref包一层
    let isShow = true
    const a = <div onClick={()=>isShow=false}>点击b消失</div>
    //必须得有一个元素包裹  不能 直接写变量 或者两个VNode写一排 都会报错 但是可以用<></>来包裹 代表啥都不是
    const b = <>
        {isShow?<div>我是b元素</div>:""
    </>
    

1-5 插槽的定义和使用(v2,v3有区别的)const slots = useSlots()

//vue2插槽的定义
const a = <div><slot></slot></div>
//父组件调用
const b  = <a>1</a>


//vue2 具名插槽的定义
const a = <div><slot name="a" data={a:"1",b:"2"}></slot></div>
//下面这种方法也是可以的 复杂情况可以用函数返回值来做 会更加方便维护
//这种方法传参我不会 一会儿给后面加个括号试试
const a = <div>
              {this.$slot.name?this.$slot.name:""}
          </div>
//父组件调用
const scopedSlots = {
    name:v=>{
        console.log(v)//{a:"1",b:"2"}
    }
}
//如果你直接在标签写 scope-slots 会不认识 因为  需要插件支持 默认是不行的
const b  = <a scopedSlots={scopedSlots}>1</a>


//vue3的插槽定义
const a = <div><slot></slot></div>
//父组件调用
const b = <a>1</a>


//vue3的具名插槽
const a = <div><slot name="a" data={a:"1",b:"2"}></slot></div>
//父组件调用
const scopedSlots = {
    name:v=>{
        console.log(v)//{a:"1",b:"2"}
    }
}
//vue3变成了这样 直接v-slot就可以
const b  = <a v-slot={scopedSlots}>1</a>


//vue3 steup的调用
import { useSlots, useAttrs } from 'vue'
//这个里面就有全部的插槽内容
const slots = useSlots()//等于 this.$slots

对于jsx还有啥需要了解的,我们可以一起探讨一下,学习一下. 或者还需要 别的的例子也可以留言告诉我,我到时候来更新. 这个东西可以看看然后无缝接react react也是这一套 大差不差