当前位置: 首页 > 编程日记 > 正文

React Native常用组件之ListView

1. ListView常用属性

  • ScrollView 相关属性样式全部继承

  • dataSource ListViewDataSource 设置ListView的数据源

  • initialListSize number
    设置ListView组件刚刚加载的时候渲染的列表行数,用这个属性确定首屏或者首页加载的数量,而不是花大量的时间渲染加载很多页面数据,提高性能。

  • onChangeVisibleRows function (visibleRows,changedRows)=>void。
    当可见的行发生变化的时候回调该方法。

  • onEndReachedThreshold number
    当偏移量达到设置的临界值调用onEndReached

  • onEndReached function

    当所有的数据项行被渲染之后,并且列表往下进行滚动。一直滚动到距离底部onEndReachedThredshold设置的值进行回调该方法。原生的滚动事件进行传递(通过参数的形式)。

  • pageSize number 每一次事件的循环渲染的行数

  • removeClippedSubviews bool

    该属性用于提供大数据列表的滚动性能。该使用的时候需要给每一行(row)的布局添加over:'hidden'样式。该属性默认是开启状态。

  • renderFooter function 方法 ()=>renderable

    在每次渲染过程中头和尾总会重新进行渲染。如果发现该重新绘制的性能开销比较大的时候,可以使用StaticContainer容器或者其他合适的组件。

  • renderHeader function 方法

    在每一次渲染过程中Footer(尾)该会一直在列表的底部,header(头)该会一直在列表的头部,用法同上。

  • renderRow function (rowData,sectionID,rowID,highlightRow)=>renderable
    该方法有四个参数,其中分别为数据源中一条数据,分组的ID,行的ID,以及标记是否是高亮选中的状态信息。

  • renderScrollComponent function

    方法 (props)=>renderable 该方法可以返回一个可以滚动的组件。默认该会返回一个ScrollView

  • renderSectionHeader function (sectionData,sectionID)=>renderable

    如果设置了该方法,这样会为每一个section渲染一个粘性的header视图。该视图粘性的效果是当刚刚被渲染开始的时候,该会处于对应的内容的顶部,然后开始滑动的时候,该会跑到屏幕的顶端。直到滑动到下一个section的header(头)视图,然后被替代为止。

  • renderSeparator function

    (sectionID,rowID,adjacentRowHighlighted)=>renderable
    如果设置该方法,会在被每一行的下面渲染一个组件作为分隔。除了每一个section分组的头部视图前面的最后一行。

  • scrollRenderAheadDistance number

    进行设置当该行进入屏幕多少像素以内之后就开始渲染该行

2. ListView的高阶特性

  • ListView同样支持一些高级特性,包括设置每一组的粘性的头部(类似于iPhone)、支持设置列表的header以及footer视图、当数据列表滑动到最底部的时候支持onEndReached方法回调、设备屏幕列表可见的视图数据发生变化的时候回调onChangeVisibleRows以及一些性能方面的优化特性。

  • ListView设计的时候,当需要动态加载非常大的数据的时候,下面有一些方法性能优化的方法可以让我们的ListView滚动的时候更加平滑:
    • 只更新渲染数据变化的那一行 ,rowHasChanged方法会告诉ListView组件是否需要重新渲染当前那一行。
    • 选择渲染的频率,默认情况下面每一个event-loop(事件循环)只会渲染一行(可以同pageSize自定义属性设置)。这样可以把大的工作量进行分隔,提供整体渲染的性能。

3. Demo1 - ListView的简单使用

3.1 代码

/*** Sample React Native App* https://github.com/facebook/react-native* @flow*/import React, {Component} from 'react';
import {AppRegistry,StyleSheet,Text,View,Image,ListView,TouchableOpacity,AlertIOS,
} from 'react-native';var Dimensions = require('Dimensions');
var {width, height} = Dimensions.get('window');
// 引入数据文件
var models = require("./Wine.json");var rn0910ListViewTest01 = React.createClass({/*** 生命周期,不可更改的属性在这里* @returns {{}}*/getDefaultProps() {return {}},/*** 生命周期,状态机在这里* @returns {{}}*/getInitialState() {// 创建数据源   rowHasChanged方法决定了ListView是否重新渲染当前这一行var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => {r1 !== r2}});return {// 数据源中的数据dataSource: ds.cloneWithRows(models)}},/*** 生命周期,复杂的操作在这里*/componentDidMount() {},/*** 生命周期,渲染* @returns {XML}*/render() {return (<ListViewdataSource={this.state.dataSource} // 指定数据源renderRow={this.renderRow} // 渲染每一行/>);},/*** ListView根据数据源的数据进行渲染* @param rowData 每一项的数据* @param sectionID 组号* @param rowID 行号* @param highlightRow* @returns {XML}*/renderRow(rowData, sectionID, rowID, highlightRow) {return (<TouchableOpacity activeOpacity={0.7} onPress={() => this.cellDidClick(rowID, rowData)}><View style={styles.wineCell}><Image style={styles.icon} source={{uri: rowData.image}}/><View style={styles.titleContainer}><Text style={styles.title}>{rowData.name}</Text><Text style={styles.subTitle}>${rowData.money}</Text></View></View></TouchableOpacity>);},cellDidClick(rowID, rowData) {alert("点击了" + rowID + rowData.name);}
});const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',paddingTop: 20},wineCell: {flexDirection: "row",borderBottomWidth: 1,borderBottomColor: '#eee',paddingLeft: 10,paddingTop: 10,paddingBottom: 10,backgroundColor: 'white'},icon: {width: 60,height: 60,},titleContainer: {flexDirection: "column",justifyContent: 'space-between'},title: {fontSize: 15,fontWeight: 'bold',width: width - 60,paddingLeft: 10,paddingRight: 10},subTitle: {fontSize: 15,marginLeft: 10,}
});AppRegistry.registerComponent('rn0910ListViewTest01', () => rn0910ListViewTest01);

3.2 效果图

762322-20170914161235953-1065960019.gif

4. ListView之九宫格布局

  listViewContentStyle: {// ListView实现九宫格布局,主要是这俩属性flexDirection: 'row',flexWrap: 'wrap'},cellStyle: {alignItems: 'center',// 每一项设置宽高width: cellWH,height: cellWH,marginLeft: hMargin,marginTop: tMargin},

4.1 代码

/*** Sample React Native App* https://github.com/facebook/react-native* @flow*/import React, {Component} from 'react';
import {AppRegistry,StyleSheet,Text,View,ListView,Image,TouchableOpacity,AlertIOS
} from 'react-native';// 引入json文件
var models = require("./shareData.json");
// 获取屏幕宽度
var Dimensions = require('Dimensions');
var screen_Width = Dimensions.get('window').width;var col = 3; // 列数
var cellWH = 100; // 每项宽高
var tMargin = 25; // 行 顶间距
var hMargin = (screen_Width - cellWH * col) / (col + 1); // 每项之间的间距var rn0912ListViewTest02 = React.createClass({/*** 不可修改的属性* @returns {{}}*/getDefaultProps() {return {}},/*** 状态机*/getInitialState() {var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});return {dataSource: ds.cloneWithRows(models.data)}},/*** 渲染* @returns {{}}*/render() {return (<ListViewdataSource={this.state.dataSource}renderRow={this.renderRow}contentContainerStyle={styles.listViewContentStyle}/>)},/*** 操作*/componentDidMount() {},renderRow(rowData) {return (<TouchableOpacityactiveOpacity={0.8}onPress={() => {alert("点击分享到" + rowData.title)}}><View style={styles.cellStyle}><Image style={styles.iconStyle} source={{uri: rowData.icon}}/><Text style={styles.nameStyle}>{rowData.title}</Text></View></TouchableOpacity>);}
});const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},listViewContentStyle: {// ListView实现九宫格布局,主要是这俩属性flexDirection: 'row',flexWrap: 'wrap'},cellStyle: {alignItems: 'center',// 每一项设置宽高width: cellWH,height: cellWH,marginLeft: hMargin,marginTop: tMargin},iconStyle: {width: 80,height: 80,},nameStyle: {fontSize: 14}
});AppRegistry.registerComponent('rn0912ListViewTest02', () => rn0912ListViewTest02);

4.2 效果图

762322-20170914161305485-366993232.gif

5. ListView黏性sectionHeader

5.1 技术点分析

  • 如何实现滚动时每个sectionHeader会吸顶?

    在ListView中要实现sticky,需要使用cloneWithRowsAndSections方法,将dataBlob(object),sectionIDs(array),rowIDs(array)三个值传进去.

dataBlob

dataBlob包含ListView所需的所有的数据(sectionHeader 和 rows),在ListView渲染数据时,使用getSectionData 和 getRowData 来渲染每一行数据. dataBlob的 key 值包含sectionID + rowID

762322-20170914161341188-561603380.png

sectionIDs

sectionIDs 用语表示每组section

762322-20170914161448735-1731122818.png

rowIDs 二维数组

rowIDs 用于描述每个section里的每行数据的位置及是否需要渲染. 在ListView渲染时,会先遍历 rowIDs 获取到对应的 dataBlob 数据

762322-20170914161502407-1862925553.png

模拟对应的数据结构

762322-20170914161520282-885268902.png

在 DataSource 中, 设置ListView获取 row 和 section 的方法

  getInitialState() {var getSectionHeaderData = (dataBlob, sectionID) => {return dataBlob[sectionID];}var getRowData = (dataBlob, sectionID, rowID) => {return dataBlob[sectionID + ":" + rowID];}return {// 设置数据源,数据庞大,在dataSource: new ListView.DataSource({getSectionHeaderData: getSectionHeaderData, // 获取组数据getRowData: getRowData, // 获取行数据rowHasChanged: (r1, r2) => {r1 !== r2}, // 什么时候创建行sectionHeaderHasChanged: (s1, s2) => {s1 !== s2} // 什么时候创建组})};},

刷新状态机,将数据传入到ListView中

this.setState({dataSource: this.state.dataSource.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs)
});

ListView中不仅要renderRow 还要 renderSectionHeader

   <ListViewdataSource={this.state.dataSource}renderRow={this.renderRow}renderSectionHeader={this.renderSectionHeader}/>

5.2 代码

/*** Sample React Native App* https://github.com/facebook/react-native* @flow*/import React, {Component} from 'react';
import {AppRegistry,StyleSheet,Text,View,ListView,Image,TouchableOpacity
} from 'react-native';var carData = require("./Car.json");var rn0913ListViewTest03 = React.createClass({/*** 不可更改的属性* @returns {{}}*/getDefaultProps() {return {};},/*** 状态机* @returns {{}}*/getInitialState() {var getSectionHeaderData = (dataBlob, sectionID) => {return dataBlob[sectionID];}var getRowData = (dataBlob, sectionID, rowID) => {return dataBlob[sectionID + ":" + rowID];}return {// 这里就没有指定数据源,由于需要处理数据,所以在componentDidMount()方法中进行数据处理dataSource: new ListView.DataSource({getSectionHeaderData: getSectionHeaderData, // 获取组数据getRowData: getRowData, // 获取行数据rowHasChanged: (r1, r2) => {r1 !== r2}, // 什么时候创建行sectionHeaderHasChanged: (s1, s2) => {s1 !== s2} // 什么时候创建组})};},/*** 渲染界面*/render() {return (<View style={styles.container}><View style={styles.nav}><Text style={styles.navTitle}>Chaos车库</Text></View><ListViewdataSource={this.state.dataSource}renderRow={this.renderRow}renderSectionHeader={this.renderSectionHeader}/></View>);},/*** 渲染每一项* @param rowData* @returns {XML}*/renderRow(rowData) {return (<TouchableOpacity activeOpacity={0.8}><View style={styles.cellStyle}><Image style={styles.imgStyle} source={{uri: rowData.icon}}/><Text style={styles.carTitleStyle}>{rowData.name}</Text></View></TouchableOpacity>);},/*** 渲染每一组* @param sectionData* @returns {XML}*/renderSectionHeader(sectionData) {return (<TouchableOpacity activeOpacity={0.8}><View style={styles.headerStyle}><Text style={styles.headerTextStyle}>{sectionData}</Text></View></TouchableOpacity>);},/*** 复杂操作*/componentDidMount() {this.loadDataFromJson();},/*** 加载数据,处理数据*/loadDataFromJson() {var jsonData = carData.data;var dataBlob = {}, // 对象sectionIDs = [],rowIDs = [], // 这是个二维数组cars = [];for (var i = 0; i < jsonData.length; i++) {// 确定每组的idsectionIDs.push(i);// 确定每组的id对应的组数据dataBlob[i] = jsonData[i].title;// 获取行集合cars = jsonData[i].cars;rowIDs[i] = []; // 二维数组,每一项都是行id的数组for (var j = 0; j < cars.length; j++) {rowIDs[i].push(j);// 确定每一行的数据dataBlob[i + ":" + j] = cars[j];}}// 给ListView的数据源赋值this.setState({dataSource: this.state.dataSource.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs)});}
});const styles = StyleSheet.create({container: {},nav: {height: 64,backgroundColor: '#eee',alignItems: 'center',justifyContent: 'center'},navTitle: {fontSize:26},headerStyle: {backgroundColor: '#ccc',height:30,},headerTextStyle: {lineHeight:30,paddingLeft:10},cellStyle: {borderBottomColor:'#eee',borderBottomWidth:0.5,flexDirection:'row',alignItems:'center',padding:10},imgStyle: {width: 60,height: 60},carTitleStyle: {marginLeft:10}
});AppRegistry.registerComponent('rn0913ListViewTest03', () => rn0913ListViewTest03);

5.3 效果图

762322-20170914161607235-2056108941.gif

感谢作者,原文地址,戳我

相关文章:

Oracle中merge into的使用

http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5980965 该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中&#xff0c;使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了…

C#运算符资料

☆C#的运算符定义只有四种形式:--------------------------------------- ①public static 返回类型 operator ?(单形参) ②public static 返回类型 operator ?(双形参) ③public static implicit operator 隐转目标类型(单源类型形参) ④public static explicit operator 显…

厉害了,网易伏羲三篇论文上榜 AI 顶会 ACL

近日&#xff0c;国际AI顶尖学术会议ACL 2021&#xff08;Annual Meeting of the Associationfor Computational Linguistics&#xff09;公布了论文录用结果。网易伏羲共有三项研究被本届ACL收录&#xff0c;内容包括自然语言生成、无监督文本表示学习等方向&#xff0c;相关技…

软件架构设计学习总结(1):标准Web系统的架构分层

1、架构体系分层图 在上图中我们描述了Web系统架构中的组成部分。并且给出了每一层常用的技术组件/服务实现。需要注意以下几点&#xff1a; 系统架构是灵活的&#xff0c;根据需求的不同&#xff0c;不一定每一层的技术都需要使用。例如&#xff1a;一些简单的CRM系统可能在产…

iOS 设置UILabel 的内边距

iOS 设置UILabel 的内边距 - (void)drawTextInRect:(CGRect)rect {UIEdgeInsets insets {0, 5, 0, 5};[super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 参考&#xff1a;http://stackoverflow.com/questions/3476646/uilabel-text-margin http://unmi.cc/uila…

从程序媛到启明星辰集团云安全总经理,郭春梅博士揭秘云时代安全攻防之道...

从无序中寻找踪迹&#xff0c;从眼前事探索未来。2021 年正值黄金十年新开端&#xff0c;CSDN 以中立技术社区专业、客观的角度&#xff0c;深度探讨中国前沿 IT 技术演进&#xff0c;推出年度重磅企划栏目——「拟合」&#xff0c;通过对话企业技术高管大咖&#xff0c;跟踪报…

javascript 异步实现方案

1、回调函数 fn1( fn2 ); 2、事件监听 fn1.on(done, fn2);function fn1() {setTimeout(function(){fn1.trigger(done);},1000) }3、发布-订阅 &#xff08;1&#xff09;fn2像“信号中心”订阅了done信号Jquery.subscribe("done", fn2);(2) fn1向信号中心发布信…

csc命令帮助

大家还是要常用用csc&#xff0c;个人感觉有时vs有不少不太方便的东西。C:/>csc /help |more Microsoft (R) Visual C# 编译器版本7.00.9254 [CLR version v1.0.2914] 版权所有 (C) Microsoft Corp 2000-2001。保留所有权利。 Visual C# 编译器选项…

利用apache+svn+jenkins+maven 实现java环境的自动化构建和部署(三)(网内首发超详细版)...

3.3 权限配置样例注意&#xff1a;* 权限配置文件中出现的用户名必须已在用户配置文件中定义。* 对权限配置文件的修改立即生效&#xff0c;不必重启svn。用户组格式&#xff1a;[groups] ,其中&#xff0c;1个用户组可以包含1个或多个用户&#xff0c;用户间以逗号分隔。版本库…

Java知识全面总结:并发编程+JVM+设计模式+常用框架+....

本文整理的Java知识体系主要包括基础知识&#xff0c;工具&#xff0c;并发编程&#xff0c;数据结构与算法&#xff0c;数据库&#xff0c;JVM&#xff0c;架构设计&#xff0c;应用框架&#xff0c;中间件&#xff0c;微服务架构&#xff0c;分布式架构等内容。同时也有作为程…

JPA主键生成策略

GeneratedValue&#xff1a; 为一个实体类生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键)。它有两个属性&#xff0c;分别是strategy和generator。 generator&#xff1a;默认为空字符串&#xff0c;它定义了主键生成器的名称&#xff0c;对应的生成器…

Silverlight 预定义颜色速查表

预定义颜色可以使用 SolidColorBrush 绘制&#xff0c;它使用预定义纯色。这可以是 Colors 的静态属性 (Property) 名称&#xff0c;也可以是指定为 XAML 属性 (Attribute) 值时直接作为字符串处理的另外一组颜色名称中的一个。有关已命名颜色表以及如何在代码中指定已命名颜色…

腾讯云TDSQL-A发布公有云版本 支持第七次全国人口普查等海量数据场景

5月18日&#xff0c;腾讯云发布首款全自研分布式分析型数据库TDSQL-A&#xff0c;全力应对海量数据实时分析需求。 这是腾讯云数据库在品牌升级后的首次新品发布&#xff0c;意味着腾讯云将这种多年积累的经验更加广泛全面地向社会行业开放&#xff0c;助力行业推进数字化进程…

Spring Boot 和 testNG 和 eclipse背景色

通过之前的博文&#xff0c;我们已经验证&#xff0c;Spring环境下完成access数据访问没有问题。下面我们直接在Spring环境下部署我们的升级项目。1.导入Spring BootSpring Boot是Spring的子项目&#xff0c;用来解决项目配置复杂性的问题&#xff0c;降低Spring的使用门槛使得…

免费丨AI内行盛会!2021北京智源大会带你与图灵奖和200+位大牛一起共话AI

数据在爆炸&#xff0c;AI在茁壮。从2012到2018年&#xff0c;深度学习模型的计算能力增长了30万倍&#xff0c;早已打破摩尔定律。可以预见的是&#xff0c;未来必然属于超大数据和超大模型&#xff0c;而破纪录的中文预训练生成语言模型智源“悟道2.0”发布在即&#xff0c;A…

LVM创建,缩减及快照备份

管理逻辑卷工具&#xff1a;LVM逻辑卷&#xff1a;灵活可动态存储的一种逻辑上的存储最底层需要通过工具变成“物理卷”&#xff1a;存储设备&#xff0c;Raid &#xff0c;分区等VG:&#xff08;1&#xff09;底层设备容量之和。&#xff08;2&#xff09;PE大小*数量卷组上面…

前端 排序算法总结

前言 排序算法可能是你学编程第一个学习的算法&#xff0c;还记得冒泡吗&#xff1f; 当然&#xff0c;排序和查找两类算法是面试的热门选项。如果你是一个会写快排的程序猿&#xff0c;面试官在比较你和一个连快排都不会写的人的时候&#xff0c;会优先选择你的。那么&#xf…

django 快速实现登录

前言 对于web开来说&#xff0c;用户登陆、注册、文件上传等是最基础的功能&#xff0c;针对不同的web框架&#xff0c;相关的文章非常多&#xff0c;但搜索之后发现大多都不具有完整性&#xff0c;对于想学习web开发的新手来说不具有很强的操作性&#xff1b;对于web应用来说&…

“云智一体”的全场景智能视频技术是什么?

全视频时代到来&#xff0c;各行各业对视频的应用、体验和效能提出全新升级需求&#xff0c;AI与云计算的发展则为智能视频进入新阶段注入充足动力。5月13日&#xff0c;百度智能云“云智技术论坛-智能视频专场”活动在北京举行&#xff0c;重磅发布了智能视频云3.0全景图。百度…

背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue...

原文:背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue[源码下载] 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue作者&#xff1a;webabcd介绍背水一战 Windows 10…

2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683...

本文原创于 2014-02-12 09:26。 今复习之用&#xff0c;有新体会&#xff0c;故重新编辑。 2014-02-12 09:26&#xff1a; 2-sat之第二斩&#xff01;昨天看了半天论文&#xff08;赵爽的和俉昱的&#xff09;&#xff0c;终于看明白了&#xff01;好激动有木有&#xff01;终…

C#方法/函数

本节课向你介绍C#的方法&#xff0c;其目的是&#xff1a; 1.了解方法的结构格式2.了解静态和实例方法之间的区别3.学会实例对象的使用4.学会如何调用实例化的对象5.学会方法的四种参数类型的使用6.学会使用"this"引用以往&#xff0c;对于每个程序来说&#xff0c;所…

Python 的一万种用法:生成字符视频

作者 | ZackSock来源 | 新建文件夹X头图 | 下载于视觉中国前言在之前也写过生成字符视频的文章&#xff0c;但是使用的是命令行窗口输出&#xff0c;效果不是很好&#xff0c;而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样&#xff1a;Python2…

Codeforces 862B - Mahmoud and Ehab and the bipartiteness

862B - Mahmoud and Ehab and the bipartiteness 思路&#xff1a;先染色&#xff0c;然后找一种颜色dfs遍历每一个点求答案。 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,si…

C#表达式,类型和变量

本节课将介绍C# 语言的表达式&#xff0c;类型和变量。本节课要达到如下几个目的&#xff1a; 1.了解什么是"变量"2.学习C#的简单类型3.对C#表达式有个初步的了解4.了解什么是String类型5.学习如何使用数组"变量"仅仅是数据的存储位置。你可以把数据存放到…

张一鸣卸任CEO,立下10年之约,期望突破线性延伸

整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;5月20日&#xff0c;字节跳动创始人张一鸣发布内部全员信&#xff0c;宣布卸任CEO&#xff0c;联合创始人梁汝波将接任这一职位。张一鸣在全员信中表示&#xff0c;“我决定卸任CE…

【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

原文链接&#xff1a;android.jlelse.eu/complete-ex… 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息。 这是一个非常简单的项目&#xff0c;但有一部分&#xff0c;我进行了一些尝试&#xff1a;测试。 在kotlin的测试上可能会有一些陷阱&#xff0c;而…

智能改变未来,创新引领世界,第二届深圳国际人工智能展暨智能制造创新高峰论坛盛大启幕!

2021年5月20日&#xff0c;由深圳市科学技术协会、深圳市商务局、深圳市福田区人民政府共同指导&#xff0c;深圳市科技开发交流中心、深圳市人工智能行业协会联合主办的2021第二届深圳国际人工智能展开幕式暨智能制造创新高峰论坛在深圳会展中心&#xff08;福田&#xff09;启…

C#循环控制语句

本节课将介绍如何使用C#控制语句中的循环语句&#xff0c;本课目的如下&#xff1a; 1.学会"while"循环的用法。2.学会"do" 循环的用法。3.学会"for" 循环的用法。4.学会foreach循环的用法。5.进一步了解"break"语句的用法。6.如何使用…

2017-09-22 前端日报

2017-09-22 前端日报 精选 JavaScript 在 V8 中的元素种类及性能优化【译】异步递归&#xff1a;回调、Promise、Async[译]HTML&CSS Lesson5: 定位一个页面阻塞问题的排查过程前端分享之cookie的使用及单点登录An event for CSS position:stickyanvaka/ngraph.path: Path f…