• vue中jsx


    //item.vue 文件如下
    <template>
     <div>
       <h1 v-if="id===1">
         <slot></slot>
       </h1>
       <h2 v-if="id===2">
         <slot></slot>
       </h2>
       <h3 v-if="id===3">
         <slot></slot>
       </h3>
       <h4 v-if="id===4">
         <slot></slot>
       </h4>
     </div>
    </template>
    
    <script>
       export default {
           name: "item",
           props:{
             id:{
               type:Number,
               default:1
             }
           }
       }
    </script>
    

    上面这种写法出现的问题

    1.那就有太多的if判断
    2.有太多的slot
    如何去优化这样的情况呢?
    我们可以使用jsx去处理这个问题的哈
    

    使用render函数和jsx来解决上面这个问题

    //item.vue子组件
    <script>
    export default {
      name: "item",
      props:{
        id:{
          type:Number,
          default:1
        }
      },
      // ${this.$slots.default[0].text} 获取传递给子组件的文本节点
      render(){
          const hText=` <h${this.id}>${this.$slots.default[0].text}</h${this.id}> `
          return <div domPropsInnerHTML={hText}></div>
      }
    }
    </script>
    

    使用的页面

    <template>
     <div>
        <!-- 这是自定义的一个组件 -->
        <h-title :id="id">Hello World</h-title>
        <button @click="next">下一个</button>
     </div>
    </template>
    
    <script>
     import Title from './item.vue'
     export default {
        data() {
          return {
              id:1
          }
        },
       components: {
         "h-title":Title
       },
       methods:{
          next(){
            if(this.id==6){
              return false
            }
            this.id++
          }
       }
     }
    </script>
    

    上述功能

    当我们点击按钮的时候,标题就会从h1-->h6
    我们使用jsx和render函数去实现的
    

    render函数的简单使用

    当我们点击按钮的时候,可以切换内容
    <!-- 子组件 item.vue -->
    <script>
    export default {
        props:{
            show:{
                type:Boolean,
                default:true
            }
        },
        render(){
            let ifText
            if(this.show){
                ifText=<p>你帅</p>
            }else{
                ifText=<h1>你丑</h1>
            }
            return (
            <div>
                {ifText}
            </div>
            )
        }
    }
    </script>
    

    使用的页面

    <template>
     <div>
        <h-title :show="showFlag">Hello World</h-title>
        <button @click="next">改变</button>
     </div>
    </template>
    
    <script>
     import Title from './item.vue'
     export default {
        data() {
            return {
                showFlag:false
            }
        },
        components: {
            "h-title":Title
        },
        methods:{
            next(){
                this.showFlag=!this.showFlag
            }
        }
     }
    </script>
    

    render函数中执行v-for语句

    <script>
      export default {
        props:{
          list:{
            type:Array,
            default:()=>{
                return ['嫣语赋','盛装','开端']
            }
          }
        },
        render(){
          return (
          <h2>
              {this.list.map((v)=>{
                  return <p>{v}</p>
              })}
          </h2>
          )
        }
      }
    </script>
    

    jsx中使用v-model

    <script>
      export default {
        data(){
          return{
            show:false,
            list:[1,2,3,4],
            text:'',
          }
        },
        methods:{
          input(e){
            this.text=e.target.value
          }
        },
        render(){
          return (
            <div>
              <input type="text" value={this.text} onInput={this.input}/>
              <p>{this.text}</p>
            </div>
          )
        }
      }
    </script>
    

    v-vodel其实是语法糖

    在jsx中{}中间是没办法写if/for语句的只能写表达式,用三元表达式来当判断了
    v-model其实是一个语法糖,主要是使用两个点:传值和监听事件改变值。
    

    jsx中怎么去使用组件了?

    很简单,只需要导入进来.
    不需要在components属性声明了,直接写在jsx使用就可以了 
    
    <script>
    import TestCom from '@/components/test-com.vue'
    export default {
      render(){
        return (
          <TestCom/>
        )
      }
    }
    </script>
    

    render的描述

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML。
    然而在一些场景中,
    你真的需要 JavaScript 的完全编程的能力,
    这就是 render 函数,它比 template 更接近编译器。
    
  • 相关阅读:
    斗鱼的sidebar的实现简陋的demo
    angular JS中使用jquery datatable添加checkbox点击事件
    angular JS中使用jquery datatable添加ng-click事件
    Redis 中文文档
    操作word的
    Redis作为消息队列服务场景应用案例(入队和出队)
    nopcommerce 商城案例
    net 将手机号码中间的数字替换成星号
    V5客服
    EF 数据库迁移(Migration)
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15973399.html
Copyright © 2020-2023  润新知