vue2中使用jsx基础

news2024/9/26 5:14:11

1、基本的模板

<script lang="jsx">
export default {
  name: 'demo1',
  // 数据定义
  data() {
    return {
      info: {
        age: 18,
      }
    }
  },
  created() {

  },
  methods: {
  },
  render() {
    return (
      <div>
        <div>我是小明,今年{this.info.age}</div>
      </div>
    )
  }
}
</script>
<style lang="scss">
</style>

2、方法、v-if、v-show、v-for 用法

下面一个示例包含一些基础的方法使用、v-if的用法、v-show、v-for的使用, 这里就偷个懒了,不挨个拆分来细讲了。 示例还是很详细的

<script lang="jsx">
const customers = {
  name: 'demo1',
  // 数据定义
  data() {
    return {
      info: {
        age: 18,
        gender: '',
        list: [
          { name: '张三', age: '18', gender: '女'},
          { name: '李四', age: '28', gender: '男'}
        ]
      },
      loginForm: {
        username: ''
      }

    }
  },
  created() {

  },
  methods: {
    /**
     *  改变性别的方法
     *  这里踩坑 ---- 建议在render函数中传参的时候,箭头函数带上event. 这样不传参数的方法得到val就是正常的undefined
     *  如果不带event, 不传参数的方法得到val会被转义, 从而v-if,v-show 在使用的过程中,针对没有数值的场景就会有bug
     *  */
    editGender(event,val) {
      console.log(event, val, 'eee')
      this.info.gender = val
    },
    // v-if 的第三种写法,函数返回
    getGender() {
      console.log(this.info.gender, '99')
      return this.info.gender ? (this.info.gender === '男' ?  <div>我是boy</div> : <div>我是girl</div>) : ''
    }
  },
  render() {
    return (
      <div>
        <div>我是小明,今年{this.info.age}</div>
        <el-button type="primary" onClick={this.editGender}>设置</el-button>
        {/* jsx中方法传参,需要用箭头函数, onClick={this.editGender('男')}直接这么写会报错 
        使用箭头函数  onClick={() => this.editGender('男')} */}
        <el-button type="primary" onClick={(event) => this.editGender(event,'男')}>设置男</el-button>
        <el-button type="primary" onClick={(event) => this.editGender(event,'女')}>设置女</el-button>
        <div>{this.info.gender}</div>
        {/* v-if的使用 */}
        <div>
          {/* 第一种三目运算 */}
          {
            this.info.gender? (this.info.gender === '男' ?  <div>我是boy</div> : <div>我是girl</div>) : ''
          }
          {/* 第二种&& */}
          {
            this.info.gender &&
            (
              (this.info.gender === '男' &&  <div>我是boy</div>)
              ||
              (this.info.gender === '女' &&  <div>我是girl</div>)
            )
          }
          {/* 第三种函数返回写法 */}
          {
            this.getGender()
          }
        </div>
        {/* v-show的用法, 简单理解利用样式display来控制 */}
        {/* style={{ display: this.info.gender ? 'block' : 'none' }} 可以这样理解
              style={obj};obj={display: this.info.gender ? 'block' : 'none'} jsx中的变量是需要写在{}中的 */}
        <div>
          <div>v-show的用法</div>
          {
            <div style={{display: this.info.gender ? 'block' : 'none'}}>{this.info.gender}</div>
          }
        </div>
        {/* v-for的使用, 简单理解是用.map代替了而已 */}
        <div>
          {
            this.info.list.map((item) => <div class="mt-10">
              <div>姓名:{item.name}</div>
              <div>年龄:{item.age}  性别: {item.gender}</div>
            </div>)
          }
        </div>
        {/* element表单示例 */}
        <div class="mt-10 w300">
          <el-input
            ref="username"
            v-model={this.loginForm.username}
            placeholder="Username"
            name="username"
            type="text"
            tabindex="1"
            auto-complete="on"
          />
        </div>

      </div>
    )
  }
}
export default customers;
</script>
<style lang="scss">
.mt-10 {
  margin-top: 10px;
}
.w300 {
  width: 300px;
}
</style>

3、父子组件传值

子组件child01中

<script lang="jsx">
export default  {
  name: 'child01',
  props: {
    age: {
      type: Number
    }
  },
  // 数据定义
  data() {
    return {
    }
  },
  created() {

  },
  methods: {
  },
  render() {
    return (
      <div>
        <div>子组件中</div>
        <div>我是小明的家长,今年小明{this.age}</div>
        <el-button onClick={() => {this.$emit('ageAdd')}}>获取小明家长的年龄</el-button>
      </div>
    )
  }
}
</script>
<style lang="scss">
</style>

父组件中:

<script lang="jsx" name="demo02">
import Child01 from '../demo02/components/child01'
import Chil02 from './components/child02'
export default  {
  name: 'demo02',
  components: { Child01, Chil02 },
  // 数据定义
  data() {
    return {
      fromParentAge: 10
    }
  },
  created() {

  },
  methods: {
    changeAge() {
      this.fromParentAge ++
    },
  },
  render() {
    return (
      <div>
        <div>父组件</div>
        <el-button onClick={this.changeAge}>更改小明的年龄</el-button>
        <child01 {
          ...{
            props: {
              age: this.fromParentAge
            },
            on: {
              ageAdd: () => { alert(`小明家长的年龄比小明大30岁,即${this.fromParentAge+30}`) }
            }
          }
        }></child01>
      </div>
    )
  }
}
</script>
<style lang="scss">
</style>

4、插槽

子组件chil02

<script lang="jsx">
export default  {
  name: 'child01',
  // 数据定义
  data() {
    return {
      age: 20
    }
  },
  created() {

  },
  methods: {
  },
  render() {
    return (
      <div>
        <div>插槽{this.age}</div>
        {this.$scopedSlots.father && this.$scopedSlots.father({name: '小明的爸爸', age: 55}) }
        {this.$scopedSlots.mother && this.$scopedSlots.mother({name: '小明的妈妈', age: 52}) }
        {this.$scopedSlots.default && this.$scopedSlots.default(this.age)}
      </div>
    )
  }
}
</script>
<style lang="scss">
</style>

父组件中

<script lang="jsx" name="demo02">
import Child01 from '../demo02/components/child01'
import Chil02 from './components/child02'
export default  {
  name: 'demo02',
  components: { Child01, Chil02 },
  // 数据定义
  data() {
    return {
      fromParentAge: 10
    }
  },
  created() {

  },
  methods: {
   /** 加个函数返回,可以很直观的知道显示的结果是object,还是数值本身 */
    showScope(scope) {
      console.log(scope)
      return `子组件传给我的参数是:${scope}`
    }
  },
  render() {
    return (
      <div>
        <div>父组件</div>
        <div>
          {
            <chil02 scopedSlots={
              {
                default: (scope) => <div>我是默认插槽, {scope}</div>,
                mother: (scope) =>
                  <div>我是具名插槽,我得名字是mother, {this.showScope(scope)}
                    <div>名字:{scope.name} 年龄:{scope.age}</div>
                  </div>,
                father: (scope) =>
                  <div>我是具名插槽,我得名字是father, {this.showScope(scope)}
                    <div>名字:{scope.name} 年龄:{scope.age}</div>
                  </div>
              }
            }></chil02>
          }
        </div>
      </div>
    )
  }
}
</script>
<style lang="scss">
</style>

这里讲下为啥要加个函数:
如果子组件里面用的插槽中传参是一个对象,

 {this.$scopedSlots.mother && this.$scopedSlots.mother({name: '小明的妈妈', age: 52}) }

在父组件中直接使用scope, 我们这时候页面上显示的是undefined, 实际上他是一个object。

<div>
          {
            <chil02 scopedSlots={
              {
                mother: (scope) =>
                  <div>我是具名插槽,我得名字是mother, {scope}</div>,
              }
            }></chil02>
          }
        </div>

如果想把整个对象显示在页面,我们用JSON.stringfy进行转一下就好。
这里可以写个函数方法进行return,
在这里插入图片描述

这时候,我们在页面上看到的就是 [object,object]在这里插入图片描述在这里插入图片描述
总结:如果子组件里传过来的不是个对象,那直接render里{scope} 没问题。如果是个对象, 直接回显就是undefined。 如果写个方法,return, 直接回显就是[object,object]。要具体使用里面的字段,就直接scope.xx即可。

补充踩坑:
1、 list没在data里定义,是不能直接用的
在这里插入图片描述

jsx中修饰符使用:
模版中的

:visible.sync="configDialog"

jsx中:

 on={{
        "update:visible": (val) => {
               this.configDialog == !!val;
            },
 }}
 visible={this.configDialog}

后续待更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逐行重现 GPT-2:第 2 部分 - 硬件优化

Andrej Karpathy 的“让我们重现 GPT-2 (124M)”第 2 部分中的硬件优化 欢迎来到雲闪世界。为了撰写这篇博文&#xff0c;我在 Google Colab 免费提供的 NVIDIA T4 GPU 和 Lambda Labs 的 NVIDIA A100 GPU 40GB SXM4 上都进行了优化。Karpathy 介绍的大多数优化都是针对 A100 或…

MES系统在数字化转型中的核心作用与影响

数字化转型是企业利用数字技术改变其业务模式、运营方式、组织结构、产品服务等方面的过程&#xff0c;旨在提高效率、降低成本、增强竞争力并实现可持续发展。数字化转型涉及多个层面&#xff0c;主要包括以下几个方面&#xff1a; 数字化转型转什么 转战略&#xff1a;由构…

VLC实现视频文件转RTSP流

1.选择本地文件 2.创建流 现在已经开始推流了&#xff1a; 3.播放上面创建的流 访问地址&#xff1a;rtsp://:8554/test111

OJ-0802

题目 分析 要点&#xff1a;在排队的基础上移动学生位置&#xff0c;实现要求的分组&#xff0c;分组的顺序不做要求&#xff0c;求移动学生次数的最小值。 实现方案&#xff1a;考虑Map 参考 解题思路&#xff1a; 1.建立索引字典:将学生目前排队情况转换成索引字典,其中键…

使用Git管理ECAD软件元器件库

在日常工作中&#xff0c;很多工程师习惯维护和使用自己的元器件库&#xff0c;这样可以方便的查找和使用元器件。但是&#xff0c;如果元器件库中的元器件数量较多&#xff0c;且元器件的版本较多&#xff0c;那么维护元器件库就会变得非常困难。还有&#xff0c;企业中的研发…

基于JAVA的进销存管理系统的设计与实现

点击下载源码 基于JAVA的进销存管理系统的设计与实现 摘 要 进入21世纪以来&#xff0c;商业管理中需要处理的数据和信息越来越多。大量的数据和繁杂的数据使得古老的手工处理数据的方式渐渐显得力不从心。甚至有些信息处理的方式在手工处理的模式下是根本无法是实现的&…

ggplot2 添加文字信息,设置黑体、斜体、旋转、对齐

目的&#xff1a;图中添加文字。 1. 每个点都添加文字 效果不好。 保持文字颜色和点一致&#xff0c;就没法斜体。 设置斜体&#xff0c;就没法保持文字颜色。 library(ggplot2) p1ggplot(iris, aes(Sepal.Length, Sepal.Width, colorSpecies))geom_point(size1.5)theme_cl…

HarmonyOS入门

HarmonyOS 系统定义 HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。 Harmony提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设置&#xff0c;提供全场景&#xff08;移动办公、运动…

QCA2066 Linux下5g 6g自适应测试方法

注意事项:如需要重启pc,需要执行rmmod wlan.ko和rmmod wlan_cnss_core_pcie.ko命令,然后重启。测试底板上电过程,需要将底板先插上电源,然后将底板pcie接口插入pc。 5g测试 启动电脑进入红色的标签Advanced options Ubuntu,然后回车 选择Ubuntu,with Linux 4.9.11+的内…

86. UE5 RPG 技能面板实现监听数据

在上一篇文章里&#xff0c;我们创建了技能面板的控制器&#xff0c;接下来&#xff0c;我们将实现通过控制器绑定委托&#xff0c;来更新显示内容。 更新技能面板应用的技能 我们首先更新技能面板上面已经应用的技能&#xff0c;让其和WBP_Overlay上面一样&#xff0c;可以更…

从零开始掌握tcpdump:参数详解

Linux tcpdump命令详解 1. 语法 tcpdump [-adeflnnNOpqStvxX] [-c <数据包数目>] [-dd] [-ddd] [-F <表达文件>] [-i <网络界面>] [-r <数据包文件>] [-s <数据包大小>] [-tt] [-T <数据包类型>] [-vv] [-w <数据包文件>] [输出数…

https执行过程,特点,作用

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

免费的短剧机器人,一键获取资源,每日自动更新,自动转存+定时删除!

今天分享一个免费的短剧机器人&#xff0c;配合网盘拉新可实现变现的项目&#xff01;可以轻松实现全自动化&#xff0c;解放双手&#xff01; 具体怎么实现&#xff0c;我们往下看&#xff1a; 我经常说&#xff0c;想赚钱&#xff0c;离不开人性! 短剧为啥火呢&#xff1f;…

深入学习并发编程中的synchronized

第一章:并发编程中的三个问题 可见性 可见性概念 可见性( Visibility ):是指一个线程对共享变量进行修改,另一个先立即得到修改后的最新值。 可见性演示 案例演示:一个线程根据 boolean 类型的标记 flag , while 循环,另一个线程改变这个 flag 变量的值,另 一个线…

【C++BFS算法 二分查找】1631. 最小体力消耗路径

本文涉及知识 CBFS算法 C二分查找 LeetCode1631. 最小体力消耗路径 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下…

【无标题】智能加速计算卡设计原理图:628-基于VU3P的双路100G光纤加速计算卡 XCVU3P板卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;北京太速科技该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功…

【深入探秘Hadoop生态系统】全面解析各组件及其实际应用

深入探秘Hadoop生态系统&#xff1a;全面解析各组件及其实际应用 引言 在大数据时代&#xff0c;如何高效处理和存储海量数据成为企业面临的重大挑战。根据Gartner的统计&#xff0c;到2025年&#xff0c;全球数据量将达到175泽字节&#xff08;ZB&#xff09;&#xff0c;传…

07 输入捕获和编码器接口

前言 前面介绍了定时器和输出比较&#xff0c;这一节主要介绍一下输入捕获测量输入频率和PWM占空比&#xff0c;然后介绍一下编码器接口。 一、输入捕获 1.什么是输入捕获 当输入的引脚有指定电平跳变时&#xff0c;会将计数器CNT中的值保存在CCR中&#xff0c;这个就称为输…

JDK 1.8从下载、安装、配置、以及检查是否安装成功,最详细教学教程

参考&#xff1a; JDK1.8下载、安装和环境配置教程(2024年6月5日)-CSDN博客 以下所有步骤&#xff0c;jjycheng作者亲测,所以截图是我自己截取的&#xff0c;和原文略有不同。这也是为什么我可耻的选择“原创”的原因。。。哈哈。。。 一、下载安装包 链接&#xff1a;https:/…

pycharm安装与配置Pyqt5

pycharm安装与配置Pyqt5 1、创建项目、虚拟环境 打开pycharm&#xff0c;File->New Project 2、安装pyqt5库 在pycharm下方Terminal终端窗口输入&#xff1a; pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douban.c…