vue 疑难杂症记录

一、render 函数渲染自定义组件注意的问题

一般使用vue render函数渲染普通的html标签时,写法如下:

render: (h) => {
   return ('div', {}, '测试内容')
}

但是有时候我们需要使用render渲染自定组件这时候就不应该在自定义的组件名上加“”号了,
写法如下:

render: (h) => {
	return (ToolBarButton, {})
}

这里假设自定义组价为ToolBarButton,加上引号后,系统一直会提示组件未注册。

二、当组件需要接受用户定义的class类名时

例如有个自定义的icon组件,它有props属性需要接收真正的类名,用来选软各种各样的组件,代码如下:

<template>
  <div class="global-tool-bar">
    <Tooltip :content="buttonTip" placement="top" theme="light" transfer :delay="tipDelayTime">
      <Icon :color="iconColor" :class="{iconBarClass: true, 'tool-bar-button': !disableDefaultOffset}" @click.native="onToolBarClick" :type="iconType" :size="iconSize"  />
    </Tooltip>
  </div>
</template>

<script>
export default {
  name: 'toolbar-button',
  props: {
    buttonTip: { type: String, default: '' },
    iconBarClass: { type: String, default: '' },
    iconType: { type: String, default: '' },
    actionName: { type: String, default: 'toolButton' },
    tipDelayTime: { type: Number, default: 700 },
    iconColor: { type: String, default: '' },
    disableDefaultOffset: { type: Boolean, default: false },
    iconSize: { type: Number | String, default: '' }
  },
  methods: {
    onToolBarClick () {
      this.$emit('on-toolbar-click', this.actionName)
    }
  }
}
</script>

这里类名使用:class={iconBarClass:true}的方式传入,vue选软时会把iconBarClass当做一个字符串对应的类名直接渲染,而不是把这个变量对应值的内容进行渲染,这样导致我们的类失效。
解决办法: 提供一个计算属性,返回变量iconBarClass的值的内容作为vue真正要渲染的class,改动后如下:

<template>
  <div class="global-tool-bar">
    <Tooltip :content="buttonTip" placement="top" theme="light" transfer :delay="tipDelayTime">
      <Icon v-if="!customer" :color="iconColor" :class="customerClass" @click.native="onToolBarClick" :type="iconType" :size="iconSize"  />
      <i v-if="customer" :class="customerClass" @click.native="onToolBarClick"></i>
    </Tooltip>
  </div>
</template>

<script>
export default {
  name: 'toolbar-button',
  props: {
    buttonTip: { type: String, default: '' },
    iconBarClass: { type: String, default: '' },
    iconType: { type: String, default: '' },
    actionName: { type: String, default: 'toolButton' },
    tipDelayTime: { type: Number, default: 700 },
    iconColor: { type: String, default: '' },
    disableDefaultOffset: { type: Boolean, default: false },
    iconSize: { type: Number | String, default: '' },
    customer: { type: Boolean, default: false }
  },
  computed: {
    customerClass () {
      return [
        { 'tool-bar-button': !this.disableDefaultOffset },
        { [this.iconBarClass]: !!this.iconBarClass }
      ]
    }
  },
  methods: {
    onToolBarClick () {
      this.$emit('on-toolbar-click', this.actionName)
    }
  }
}
</script>
``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值