我创建了这个小函数来查找特定type
的孩子。
我希望能够通过jQuery,[name="example"]
这样的属性来选择孩子。有没有办法从jQuery中剥离字符串选择器功能来创建一个对象映射来提供给像lodash' s _.find
这样的东西?
我意识到这是一个选择/查找/过滤数组的假解决方案,但我认为它非常有用。我也知道它不会找到很深的孩子,它只会处理直接的孩子。
这是否已存在于反应中?
function containsElement (element, children) {
var result = []
element = _.flatten([element])
if (React.isValidElement(children) && !_.isArray(children)) {
var contains = _.contains(element, children.type)
if (contains) return children
return false
} else if (!React.isValidElement(children) && !_.isArray(children)) {
return false
}
children.forEach(function (child) {
var isElm = React.isValidElement(child)
var contains = _.contains(element, child.type)
if (isElm && contains) {
result.push(child)
}
})
if (!result.length) return false
return result
}
答案 0 :(得分:1)
有一个名为react-query的小型开源库就是这样做的。
编辑:反应查询存储库已由所有者归档。它现在是只读的。
答案 1 :(得分:0)
这是我想要的只支持元素类型的简单版本。
selectElements('div, span', this.props.children)
理想情况下,我可以执行此操作,并且divs
name
设置为prop
,所有hello
都会得到。
selectElements('div[name="hello"]', this.props.children)
以下是(jsbin)的完整示例。
var selectElements = function (selectorString, reactElements) {
var selectors = selectorString.split(',')
selectors = _.map(selectors, function (item) {
return item.replace(/^\s+|\s$/, '')
})
return _.filter(reactElements, function (reactElement) {
return _.contains(selectors, reactElement.type)
})
}
var OnlyElements = React.createClass({
displayName: 'OnlyElements',
getInitialState: function () {
return {
children: this.props.children
}
},
componentWillMount: function () {
this.setState({
children: selectElements(this.props.allow, this.props.children)
})
},
render: function () {
return (
<div>
{this.state.children}
</div>
)
}
})
var Test = React.createClass({
displayName: 'Test',
render: function () {
return (
<OnlyElements allow='div'>
<span>Alpha</span>
<div>Beta</div>
<span>Gamma</span>
</OnlyElements>
)
}
})
React.render(<Test/>, document.body)