三面
数据结构:
为什么需要二叉树?
B+树?
跳表?
王圆圆的每日报告
三个部分。
基本信息,中南大学研二王雨思,研究方向是数据可视分析,项目中有专利一项、参与A类会议论文一篇、主持自由探索项目一项,该项目论文预计4月投稿,投稿完成后即可到岗实习。
项目经历,可视分析项目有三项,主要是关于高维数据可视分析的。同时自己对iOS开发有些兴趣,申请了开发者账号,目前审核中APP有两款。
详细介绍我的项目。
适合数据中台可视化的原因:
更新node和npm至新版(要求:Node >= 6 and npm >= 5.2)
1 | npx create-react-app my-app |
项目入口:index.js
内容写在:APP.js
网页整个是一个组件,各个部分也是一个组件。
只要是页面上的一部分,就是一个组件。eg.网页上的标签
index.js
1 | // react:让浏览器理解<App />组件的语法 |
App.js
1 | import React from 'react'; |
允许在react中,直接使用标签<>结构
注释:{/ /}
class样式为:className,否则会被认为是组件类的class
label的for标签为:htmlFor,否则会被认为是for循环关键字
React 面向数据编程,不实际操作Dom
构造函数中控制数据
1 | // Todolist组件的构造函数,组件创造的瞬间,自动执行。 |
1 | <ul> |
1 | // 1 添加任务 |
数据项被点击后:
1 | // 2 删除任务 |
写法一,直接写在HTML标签内:
1 | <button onClick={this.handleBtnClick.bind(this)}>add</button> |
若不绑定,则handleBtnClick()函数中的this则指的是button,而不是组件props本身。
写法二,写在构造函数中:提升代码执行性能(底层内容)
1 | render() { |
父组件通过属性的方式向子组件传递参数
子组件通过props的形式接收父组件传递的参数
行内样式 style
1 | /* 外层{}表示为JS表达式;里面的{}表达式为JS的对象*/ |
className的方法(不能使用class关键字,react中的class关键字表示定义一个组件)
1 | <button className='red-btn' onClick={this.handleBtnClick}>add</button> |
步骤:关键字className,定义css文件,在入口处index.js引入css文件
###
1 | // setState性能优化的方式:函数的形式变为异步的setState |
1 | // 新方法: |
减少大量dom操作代码量
react只去管理id=”root”的div的渲染。jQuery可以管理其他div操作。
父组件可以向子组件传值(只读),子组件不能去改变这个值。
why单项数据流:防止其中一个改变时出现bug,难以定位是哪一个组件改变导致的错误。
只解决数据和渲染的问题,不解决react复杂传值问题,可以借助其他redux等数据传递框架
代码逻辑清晰:拆分函数,各司其职;
前端自动化测试便捷:只需要给函数一个数值,查看输出是否符合预期。
让用户查看当地天气、查询异地天气的时看到正能量文字,元气满满的开始新的一天。
本程序共分为三个页面:欢迎页面,天气预览界面,城市天气查询界面。
天气预览界面:定位天气展示【1 获取当前经纬度位置 2 根据位置获取天气、城市信息 3将信息展示在视图】
城市天气查询界面:用户查询天气【1展示当前城市 2输入框输入查询城市的名称 3按下查询按钮-获取名称至页面1,销毁页面2 】
model部分负责数据,我们构建天气类,属性包括:温度、城市、condition,以及计算属性——icon、words,他们需要根据condition属性来确定。比如晴天对于icon为小太阳、文字对于“天晴是你的心情”。
controller负责两个页面中的业务逻辑:从model中取数据,然后返回给view。
最终在view上展示所需天气及其文字信息。
页面跳转传值部分。【功能:按页面1右上角按钮,跳转到页面二,页面二展示当前city;用户输入目标city,按查询后跳转回页面一,展示查询city的天气信息】
segue导航正向传值较容易,3步骤。1在prepare函数部分获取segue的identifier【转换箭头】,2使用as!强制转化,实例化该segue的destination页面vc,3使用实例化的vc进行传值。这样就可以在下一个页面使用本页面中的“所在城市”的信息了。
而反向传值就不同。如果采用control+drag方式,从页面二的button到页面一加上转换箭头,这样只会再重新生成新的页面一,定位到本地天气;而不是预想的回到原先页面,重新展示所搜索城市的信息。
所以需要自定义protocol,使用delegate实现导航的反向传值。
1自定义协议,安排协议中的方法(获取输入的city,传给页面一),2 声明协议属于页面二中的delegate变量 3规定在哪里触发协议中的事件。
1遵守协议 2 实现协议中的方法(获取city值,根据值获取温度对象的所有信息,展示与本页面)3 第二个页面vc的事件函数委托delegate给self实现。
1 委托本页面,实现定位协议中的请求位置的方法,获得经纬度。(难点)
2 根据经纬度信息,使用Alamofire请求API来获取天气数据;
3 利用SwiftJSON解析生成数据;
4 给weather对象赋值;
5 再使用weather对象中的天气、文字信息更新页面。
✨使用了定位协议CLLocationManagerDelegate的方法。
1 遵守定位协议 2 实例化定位管理器CLLocationManager 3 实现协议中的方法(获取当前的经纬度)4locationManager委托本页面
当manager请求位置的时候,则系统自动调用manager方法,在该方法里获得经纬度。
协议——工具间,协议中的方法——工具,实例化的对象——老板,本页面self——打工仔,委托——老板让打工仔干活
model中的计算属性——compute属性 某个属性需要根据另一个属性来确定,我们定义其为计算属性
如根据天气情况属性——晴天,得到对应的icon和words:icon为小太阳、wors为“天晴是你的心情”。
Alamofire:完成http请求天气数据
SwiftJSON:解析、生成数据
目的:提高代码可读性。为日后重构代码打下了良好的基础。
场景:1 私有的辅助函数 ;2 遵守协议(实现某个协议的方法放到一个 extension 中);3 模型(Model用结构体, 使用extension 将 Model 的 属性 和 基于属性的计算计算属性分离 )