React列表渲染
真实开发中我们会从服务器请求到大量的语法数据,数据会以列表的列表形式存储:
比如歌曲、歌手、渲染详解排行榜列表的语法数据;
比如商品、购物车、列表评论列表的渲染详解数据;
比如好友消息、动态、语法联系人列表的列表数据;
在React中并没有像Vue模块语法中的v-for指令,而且需要我们通过JavaScript代码的渲染详解方式组织数据,转成JSX:
很多从Vue转型到React的语法小伙伴非常不习惯,认为Vue的列表方式更加的简洁明了;
但是React中的JSX正是因为和JavaScript无缝的衔接,让它可以更加的渲染详解灵活;
另外我经常会提到React是真正可以提高我们编写代码能力的一种方式;
如何展示列表呢?
在React中,展示列表最多的语法方式就是使用数组的
map高阶函数
;
class App extends React.Component { constructor() { super() this.state = { students: [ {name: "aaa", age: 18, score: 99, id: 101}, {name: "bbb", age: 19, score: 88, id: 102}, {name: "ccc", age: 17, score: 77, id: 103}, {name: "ddd", age: 17, score: 98, id: 104} ] } } render() { const { students } = this.state return ( { students.map(stu =>{ return( 学号: {stu.name}
年龄: {stu.age}
成绩: {stu.score}
) }) } ) }}const app = ReactDOM.createRoot(document.querySelector("#app"))app.render()
很多时候我们在展示一个数组中的数据之前,需要先对它进行一些处理:
比如过滤掉一些内容:filter函数; 例如上面代码中,列表 要求展示学生分数大于80的
class App extends React.Component { constructor() { super() this.state = { students: [ {name: "aaa", age: 18, score: 99, id: 101}, {name: "bbb", age: 19, score: 88, id: 102}, {name: "ccc", age: 17, score: 77, id: 103}, {name: "ddd", age: 17, score: 98, id: 104} ] } } render() { const { students } = this.state // 对数组过滤再遍历 const filterStudents = students.filter(item =>{ return item.score >80 }) return ( { filterStudents.map(stu =>{ return( 学号: {stu.name}
年龄: {stu.age}
成绩: {stu.score}
) }) } ) }}const app = ReactDOM.createRoot(document.querySelector("#app"))app.render()
比如截取数组中的一部分内容:slice函数, 例如上面代码中, 要求截取数组的前两条进行展示
class App extends React.Component { constructor() { super() this.state = { students: [ {name: "aaa", age: 18, score: 99, id: 101}, {name: "bbb", age: 19, score: 88, id: 102}, {name: "ccc", age: 17, score: 77, id: 103}, {name: "ddd", age: 17, score: 98, id: 104} ] } } render() { const { students } = this.state // 对数组截取再遍历 const spliceStudents = students.splice(0,2) return ( { spliceStudents.map(stu =>{ return( 学号: {stu.name}
年龄: {stu.age}
成绩: {stu.score}
) }) } ) }}const app = ReactDOM.createRoot(document.querySelector("#app"))app.render()
上面的操作先过滤, 再截取, 最后进行遍历, 其实可以通过链式调用一行代码完成
class App extends React.Component { constructor() { super() this.state = { students: [ {name: "aaa", age: 18, score: 99, id: 101}, {name: "bbb", age: 19, score: 88, id: 102}, {name: "ccc", age: 17, score: 77, id: 103}, {name: "ccc", age: 17, score: 77, id: 103}, {name: "ddd", age: 17, score: 98, id: 104} ] } } render() { const { students } = this.state return ( {/* 链式调用, 一步操作完成 */} { students.filter(item =>item.score >80).splice(0, 2).map(stu =>{ return( 学号: {stu.name}
年龄: {stu.age}
成绩: {stu.score}
) }) } ) } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render()
我们会发现在前面的代码中如果没有绑定key就会会报一个警告, 这个警告是告诉我们需要在列表展示的jsx中添加一个key
key主要的作用是为了提高diff算法时的效率;
作者:休闲