SlotOutletNode,
createFunctionExpression
} from '../ast'
-import { isSlotOutlet, findProp } from '../utils'
+import { isSlotOutlet, isBindKey, isStaticExp } from '../utils'
import { buildProps, PropsExpression } from './transformElement'
import { createCompilerError, ErrorCodes } from '../errors'
import { RENDER_SLOT } from '../runtimeHelpers'
let slotName: string | ExpressionNode = `"default"`
let slotProps: PropsExpression | undefined = undefined
- // check for <slot name="xxx" OR :name="xxx" />
- const name = findProp(node, 'name')
- if (name) {
- if (name.type === NodeTypes.ATTRIBUTE && name.value) {
- // static name
- slotName = JSON.stringify(name.value.content)
- } else if (name.type === NodeTypes.DIRECTIVE && name.exp) {
- // dynamic name
- slotName = name.exp
+ const nonNameProps = []
+ for (let i = 0; i < node.props.length; i++) {
+ const p = node.props[i]
+ if (p.type === NodeTypes.ATTRIBUTE) {
+ if (p.value) {
+ if (p.name === 'name') {
+ slotName = JSON.stringify(p.value.content)
+ } else {
+ p.name = camelize(p.name)
+ nonNameProps.push(p)
+ }
+ }
+ } else {
+ if (p.name === 'bind' && isBindKey(p.arg, 'name')) {
+ if (p.exp) slotName = p.exp
+ } else {
+ if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) {
+ p.arg.content = camelize(p.arg.content)
+ }
+ nonNameProps.push(p)
+ }
}
}
- const propsWithoutName = name
- ? node.props.filter(p => p !== name)
- : node.props
-
- if (propsWithoutName.length > 0) {
- //#2488
- propsWithoutName.forEach(prop => {
- if (
- prop.type === NodeTypes.DIRECTIVE &&
- prop.arg &&
- prop.arg.type === NodeTypes.SIMPLE_EXPRESSION
- ) {
- prop.arg.content = camelize(prop.arg.content)
- }
- })
-
- const { props, directives } = buildProps(node, context, propsWithoutName)
+ if (nonNameProps.length > 0) {
+ const { props, directives } = buildProps(node, context, nonNameProps)
slotProps = props
if (directives.length) {