React Fragment在Input组件中失效,求替代实现方案
解决React.Fragment包裹select选项失效的问题
嘿,我来帮你搞定这个问题!首先得先指出你代码里的一个小疏漏:内层的that.props.general.adprefrec.map回调里没有return <option>元素,这会导致这部分选项根本不会渲染出来,这可能是你觉得“失效”的主要原因之一。
接下来回到Fragment的替代方案——其实在<select>内部,直接返回数组形式的子元素就可以,完全不需要用Fragment包裹(因为<select>只认<option>或<optgroup>作为直接子节点,Fragment在这里反而有点多余)。另外,如果你的分类名(CategName)是用来分组选项的,用<optgroup>会更语义化,也能避免额外的包裹元素。
下面给你两种可行的写法:
写法1:用数组替代React.Fragment
把原本Fragment里的元素放到一个数组里返回,注意每个元素都要有唯一的key:
<FormGroup> <Input type="select" name="selectMultiPrefs" id="MultiPrefs" multiple> {this.state.arrayForCategs.map((CategName, index) => { // 先创建分类标题的option const categoryOption = ( <option key={`category-${index}`} value={CategName} disabled> {CategName} </option> ); // 处理内层的选项,注意要return! const subOptions = that.props.general.adprefrec.map((AdSingle, subIndex) => ( <option key={`sub-${index}-${subIndex}`} value={AdSingle.prefid}> {AdSingle.name} </option> )); // 返回数组,替代Fragment return [categoryOption, ...subOptions]; })} </Input> </FormGroup>
写法2:用
如果CategName是用来作为选项组的标题,用<optgroup>会更合适,它本身就是为select的选项分组设计的,不需要额外的包裹:
<FormGroup> <Input type="select" name="selectMultiPrefs" id="MultiPrefs" multiple> {this.state.arrayForCategs.map((CategName, index) => ( <optgroup key={`group-${index}`} label={CategName}> {that.props.general.adprefrec.map((AdSingle, subIndex) => ( <option key={`opt-${index}-${subIndex}`} value={AdSingle.prefid}> {AdSingle.name} </option> ))} </optgroup> ))} </Input> </FormGroup>
额外提示:我把你原来的keyNum++换成了基于index的唯一key,这样更符合React的key规范(避免使用全局递增的变量,容易导致key重复或混乱)。另外,你可以把普通函数换成箭头函数,这样就不用额外声明that来指向组件实例,直接用this就能访问属性啦~
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

