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值应该都是保持唯一性的。

虽然上面用到了组件,但是组件本不难,看一下就知道怎么做了,后面再出详细的笔记。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的飞牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值