saven
Version:
75 lines (67 loc) • 1.77 kB
JavaScript
import Nerv from 'nervjs'
class CheckboxGroup extends Nerv.Component {
constructor () {
super(...arguments)
this.state = {
value: []
}
this.uniqueName = Date.now().toString(36)
this.toggleChange = this.toggleChange.bind(this)
}
toggleChange (e, i) {
this.state.value[i] = {
name: e.target.textContent,
value: e.target.value,
checked: e.target.checked
}
const resp = []
this.state.value.forEach(v => {
if (v.checked) {
resp.push(v.value)
}
})
const { onChange } = this.props
Object.defineProperty(e, 'detail', {
enumerable: true,
value: {
value: resp
}
})
onChange && onChange(e)
}
render () {
const { name = this.uniqueName } = this.props
// 给 children 绑定事件
const children = Nerv.Children.toArray(this.props.children).map(
(item, i) => {
let _key = item.props.for
const chd = Nerv.Children.toArray(item.props.children).map(ch => {
if (ch.name === 'Checkbox') {
if (ch.props.checked) {
this.state.value[i] = {
name: ch.props.name,
value: ch.props.value,
checked: true
}
} else {
this.state.value[i] = {
name: ch.props.name,
value: ch.props.value,
checked: false
}
}
return Nerv.cloneElement(ch, {
onChange: e => this.toggleChange(e, i),
for: _key,
name: name
})
}
return ch
})
return Nerv.cloneElement(item, '', chd)
}
)
return children
}
}
export default CheckboxGroup