React节点属性,列表渲染
节点属性渲染
需要注意jsx语法的元素属性
- 由于jsx语法是和js语法相包容的,所以,jsx里的语法会和js的语法相冲突,比如说,元素的属性值class和js里的关键字class重名,所以,html的元素在jsx的语法里,使用这些属性名的时候就要注意与js的关键字等冲突,这里的class被替换成了className:
<script type="text/babel"> const element = (
<div>
<h2 class="active">Hello word!</h2>
</div>
);
ReactDOM.render(
element,
document.querySelector("#app")
)
</script>
即便是因为某些原因使其生效了,但是并不符合规范!!!
- 除此之外,还有很多基本的元素也需要注意:
<script type="text/babel">
const element = (
<div>
<h2 className="active"> Hello word!</h2>
<input type="button" value="按钮">
<input type="checkbox" name="ipt" id="ipt" checked/>
</div>
);
ReactDOM.render(
element,
document.querySelector("#app")
)
</script>
- 也比如label的for:
<script type="text/babel">
const element = (
<div>
<h2 className="active">Hello word!</h2>
<label for="ipt">单选按钮</label>
<input type="checkbox" name="ipt" id="ipt" defaultChecked />
</div>
);
ReactDOM.render(
element,
document.querySelector("#app")
)
</script>
jsx的语法相对html是较严格的,标签必须规范,自闭和标签必须闭合等。
react的语法提示也是非常亲民,不用过于担心。
列表渲染
- 如果是数组,自动根据key值遍历:
<script type="text/babel"> const arr = [
1,
2,
3
]
const arr2 = [
'a',
'b',
'c'
]
const arrLi = [
<li key="1">1</li>,
<li key="2">2</li>,
<li key="3">3</li>
]
const element = (
<div>
{arrLi}
{arr}
{arr2}
</div>
);
ReactDOM.render(element,document.querySelector("#app"))
</script>
当然,这些无效的数组可以通过map方法重新打包成<li>{number}</li>
的jsx对象,然后返回给渲染的元素。
- 如果是对象:
<script type="text/babel">
const obj = [
{
name:'Bob',
age:'18',
sex:'女'
},
{
name:'Lucy',
age:'16',
sex:'女'
},
{
name:'Atom',
age:'80',
sex:'男'
}
]
const element = []
obj.forEach((item,index)=>{
element.push(<li key={index}>name:{item.name} - age:{item.age} - sex:{item.sex}</li>);
//如果渲染的是数组,一定要在每一个渲染对象里插入key,作为遍历参考!不然会报错
})
ReactDOM.render(element,document.querySelector("#app"))
</script>
为什么渲染列表需要键入key值
- Keys可以在DOM中的某些元素被增加或删除的时候帮助React识别哪些元素发生了变化。因此你应当给数组中的每一个元素赋予一个确定的标识。
- 一个元素的key最好是这个元素在列表中拥有的一个独一无二的字符串。通常,我们使用来自数据的id作为元素的key:
const todoItems = todos.map((todo) => <li key={todo.id}>
{todo.text}
</li>
);
- 元素的key只有在它和它的兄弟节点对比时才有意义。
比方说,如果你提取出一个ListItem组件,你应该把key保存在数组中的这个<ListItem />
元素上,而不是放在ListItem组件中的<li>
元素上。
- 如果使用组件化思想,你定义了一个list的组件,用于列表的渲染:
function ListItem(props) { const value = props.value;
return (
// 错啦!你不需要在这里指定key:
<li key={value.toString()}>
{value}
</li>
);
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
//错啦!元素的key应该在这里指定:
<ListItem value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('root')
);
- 正确的使用方式
<script type="text/babel"> function ListItem(props) {
// 对啦!这里不需要指定key:
return <li>{props.value}</li>;
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
//key应该在数组的上下文中被指定
<ListItem key={number.toString()} value={number} />
);
console.log(listItems);
return (
<ul>
{listItems}
</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('app')
);
</script>
- 因为本来渲染的时候这个key是用来和兄弟节点做对比,不会显示到html页面中作为一个key的属性,所以,key加载li里是不合适的,也会让react进行不必要的识别,造成拖累性能,加在数组上下文中则会更加方便react渲染和识别。
- 不管任何时候,key值应该都是保持唯一性的。
虽然上面用到了组件,但是组件本不难,看一下就知道怎么做了,后面再出详细的笔记。
以上是 React节点属性,列表渲染 的全部内容, 来源链接: utcz.com/z/381813.html