项目基础:RN ,taro框架,实现H5
1.无限加载的实现
1 import Taro, { Component } from '@tarojs/taro' 2 import { View, Text, ScrollView } from '@tarojs/components' 3 // import { connect } from '@tarojs/redux' 4 // import { add, minus, asyncAdd } from '@/actions/counter' 5 import { AtLoadMore } from "taro-ui" 6 import fetch from '@/api/request.js' 7 import PersonNews from '@/components/PersonNews' 8 9 import styles from './index.module.scss' 10 import '../staticPic/icon.scss' 11 12 13 // 时间戳转换 14 function add0(m){return m<10?'0'+m:m } 15 function timeFormat(timestamp){ 16 17 var time = new Date(timestamp); 18 var year = time.getFullYear(); 19 var month = time.getMonth()+1; 20 var date = time.getDate(); 21 var hours = time.getHours(); 22 var minutes = time.getMinutes(); 23 var seconds = time.getSeconds(); 24 return year+'-'+add0(month)+'-'+add0(date)+' '+add0(hours)+':'+add0(minutes)+':'+add0(seconds); 25 } 26 27 // @connect(state => state.counter, { add, minus, asyncAdd }) 28 class NewsInform extends Component { 29 30 config = { 31 navigationBarTitleText: '行家' 32 } 33 34 35 state = { 36 selectTabType: 0, //判断加载的消息类型 37 selectLoadCourse:0, //课程加载结束状态 38 selectLoadPlatfrom:0, //平台加载状态 39 listClass:[], //课程消息 40 listPlatform:[], // 平台消息 41 count: 1, // 课程消息未读总数 42 paltfromCount: 1, // 平台消息未读总数 43 status: 'more', 44 statusCourse: 'more', 45 defaultColor: false, 46 defaultColor2: true, 47 courseAll:1, // 所有的课程消息数目 48 platfromAll:1, // 所有的平台消息数目 49 page:1, // 平台页码 50 pageCourse:1, // 课程页码 51 } 52 53 // 慎用 54 componentWillReceiveProps(nextProps) { 55 console.log(this.props, nextProps) 56 } 57 componentDidShow () { // 每次进入页面就会执行数据的信息 58 console.log('改变消息的状态') 59 if (this.state.selectTabType === 0) { 60 this.msgUnReadCount() //平台未读消息 61 console.log(this.state.listPlatform, '返回的数据之前'); 62 Taro.getStorage({ key: '0' }) // 通过key判断是平台的消息,从url获得跳转到消息详情的id然后在消息页面回显 63 .then(res => this.setState({ 64 listPlatform:this.state.listPlatform.map(i => { // 遍历之前的数据,通过比较msgId然后改变消息已读的状态,全局的信息是通过taro自己携带Taro.setStorage({ key: type, data: id }) // 设置消息详情的数据到全局 65 if ( i.msgId == res.data) { 66 i.isReaded = 1; 67 } 68 return i; 69 }) 70 })) 71 console.log(this.state.listPlatform, '返回的数据之后'); 72 } else if (this.state.selectTabType === 1) { 73 this.courseUnReadMsgCount() // 课程消息未读总数 74 Taro.getStorage({ key: '1' }) 75 .then(res => this.setState({ 76 listClass:this.state.listClass.map(i => { 77 if ( i.msgId == res.data) { 78 i.isReaded = 1; 79 } 80 return i; 81 }) 82 })) 83 } 84 85 86 87 } 88 componentDidMount () { 89 this.courseClick() // 课程的数据 90 this.pageClick() // 平台消息的数据 91 this.platnewsClick() //初次渲染平台消息的数据 92 this.courseMsgCount() // 课程消息总数 93 this.courseUnReadMsgCount() // 课程消息未读总数 94 this.msgUnReadCount() //平台未读消息 95 } 96 97 // 请求课程消息的数据 98 courseClick = () => { 99 fetch('getCourseMsg', { 100 SSOTOKEN:Taro.getStorageSync('token'), 101 pageSize:5, 102 page:this.state.pageCourse, 103 }).then((res) => { 104 console.log(res, '课程消息的接口') 105 this.setState({ 106 listClass: res, 107 selectLoadCourse:1, 108 pageCourse:this.state.pageCourse+1, 109 }) 110 if (res.length <= 5) { 111 this.setState({ 112 status:'noMore' 113 }) 114 } 115 }) 116 } 117 118 // 请求平台消息的数据 119 pageClick() { 120 this.setState({ 121 defaultColor: false, 122 defaultColor2: true, 123 }) 124 fetch('getplatformMsg', { 125 SSOTOKEN:Taro.getStorageSync('token'), 126 pageSize:5, 127 page:this.state.page, 128 }).then((res) => { 129 console.log(res, '平台消息接口') 130 this.setState({ 131 listPlatform: res, 132 selectLoadPlatfrom:1, 133 page:this.state.page+1, 134 }) 135 if (res.length <= 5) { 136 this.setState({ 137 status:'noMore' 138 }) 139 } 140 }) 141 } 142 143 // 课程消息点击事件 144 courseNewsClick() { 145 this.setState({ 146 defaultColor: true, 147 defaultColor2: false, 148 selectTabType: 1, 149 }) 150 } 151 // 平台消息点击事件 152 platnewsClick() { 153 this.setState({ 154 selectTabType: 0, 155 defaultColor: false, 156 defaultColor2: true 157 }) 158 } 159 160 // 请求课程消息总数 161 courseMsgCount () { 162 fetch('getCourseAllMsg', { 163 SSOTOKEN:Taro.getStorageSync('token'), 164 }).then((res) => { 165 console.log(res, '课程消息总数') 166 this.setState({ 167 courseAll:res.count 168 }) 169 }) 170 } 171 172 // 平台消息总数 173 courseMsgCount () { 174 fetch('getPlatfromAllMsg', { 175 SSOTOKEN:Taro.getStorageSync('token'), 176 }).then((res) => { 177 console.log(res, '平台消息总数') 178 this.setState({ 179 platfromAll:res.count 180 }) 181 }) 182 } 183 // 请求未读消息 184 courseUnReadMsgCount () { 185 fetch('getCourseUnReadMsg', { 186 SSOTOKEN:Taro.getStorageSync('token'), 187 }).then((res) => { 188 console.log(res, '课程未读总数') 189 this.setState({ 190 count: res.count, 191 }) 192 }) 193 } 194 // 平台未读消息 195 msgUnReadCount () { 196 fetch('getMsgUnReadCount', { 197 SSOTOKEN:Taro.getStorageSync('token'), 198 }).then((res) => { 199 console.log(res, '平台未读总数') 200 this.setState({ 201 paltfromCount: res.count, 202 }) 203 }) 204 } 205 206 goDetails(id) { // 跳转 207 console.log(id, 'selectTypeId数据') 208 Taro.navigateTo({ 209 url: `/personCenter/pages/personalCenter/newsDetails/index?id=${id}&type=${this.state.selectTabType}`, 210 }) 211 } 212 213 goBack() { //回退一级 214 Taro.navigateBack({ delta: 1 }) 215 } 216 loadClick = () => { 217 console.log('上拉到底部触发',this.state.platfromAll,this.state.courseAll) 218 // 判断要操作的容器(selectTabType) 219 if (this.state.selectTabType === 0) { // 平台 220 if (this.state.selectLoadPlatfrom === 1) { 221 this.setState({ 222 defaultColor: false, 223 defaultColor2: true, 224 status: 'loading' // 平台加载 225 }) 226 fetch('getplatformMsg', { 227 SSOTOKEN:Taro.getStorageSync('token'), 228 pageSize:5, 229 page:this.state.page, 230 }).then((res) => { 231 console.log(res, '平台消息接口') 232 if (res.length == 0) { 233 this.setState({ 234 status: 'noMore', 235 selectLoadPlatfrom:0 236 }) 237 } else { 238 // 有更多数据的时候 239 let moreData = this.state.listPlatform.concat(res); 240 this.setState({ 241 listPlatform:moreData, 242 selectLoadPlatfrom:1, 243 page:this.state.page+1, 244 status: 'more' 245 }) 246 } 247 }) 248 } 249 } else if (this.state.selectTabType === 1) { // 课程 250 console.log('进入课程数据的上啦加载',this.state.selectTabType,'课程加载完之后的数据',this.state.selectLoadCourse) 251 if (this.state.selectLoadCourse === 1) { 252 console.log('课程已经加载完毕',this.state.selectTabType) 253 this.setState({ 254 defaultColor: true, 255 defaultColor2: false, 256 statusCourse: 'loading' // 课程加载 257 }) 258 fetch('getCourseMsg', { 259 SSOTOKEN:Taro.getStorageSync('token'), 260 pageSize:5, 261 page:this.state.pageCourse, 262 }).then((res) => { 263 console.log(res, '课程消息接口') 264 if (res.length == 0) { 265 console.log('没数据了') 266 this.setState({ 267 statusCourse: 'noMore', 268 selectLoadCourse:0 269 }) 270 } else { 271 // 有更多数据的时候 272 let moreData = this.state.listClass.concat(res); 273 this.setState({ 274 listClass:moreData, 275 selectLoadCourse:1, 276 pageCourse:this.state.pageCourse+1, 277 statusCourse: 'more' 278 }) 279 } 280 }) 281 } 282 } 283 // 判断是否单次加载完毕 284 285 // 判断是否全部加载完毕 286 287 // 设置为请求状态 288 289 // 请求数据 290 291 // 设置请求状态(单次完成 or 全部加载完毕) 292 293 // 设置数据到对应的容器 294 } 295 296 297 298 render() { 299 300 let styleObj = { 301 color: this.state.defaultColor?'#666':'#ff7847' 302 } 303 let styleObj2 = { 304 color: this.state.defaultColor2?'#666':'#ff7847' 305 } 306 307 let mapListData = []; // 对容器的数据进行筛选 308 if (this.state.selectTabType === 0) { 309 mapListData = this.state.listPlatform.concat([]); 310 } else if (this.state.selectTabType === 1) { 311 mapListData = this.state.listClass.concat([]); 312 } 313 314 315 return ( 316 317 <View className={styles.content}> 318 <View className={styles.componentsPage}> 319 <View style={styleObj} className={styles.button} onClick={this.platnewsClick.bind(this)}><Text className='iconfont icon-left' style={{float:'left',paddingLeft:'21px',color:'#666'}} onClick={this.goBack.bind(this)}></Text> 320 平台消息{(this.state.paltfromCount!=0)&&<Text className={styles.number1}>{this.state.paltfromCount}</Text>}</View> 321 <View style={styleObj2} className={styles.button} onClick={this.courseNewsClick.bind(this)}>课程消息{(this.state.count!=0)&&<Text className={styles.number}>{this.state.count}</Text>}</View> 322 </View> 323 <ScrollView 324 scrollY 325 scrollWithAnimation 326 scrollTop='0' 327 style={{height:'667px',marginTop:'44px'}} 328 lowerThreshold='20' 329 upperThreshold='20' 330 onScrollToLower={this.loadClick} 331 hidden={this.state.selectTabType==0?false:true} 332 > 333 { 334 mapListData.map((item,index) => { 335 item.pushTime = timeFormat(item.pushTime); 336 return <PersonNews key={index} isReaded={item.isReaded} title={item.title} describe={item.describe} pushTime={item.pushTime} ongoDetails={()=>this.goDetails(item.msgId)} /> 337 }) 338 } 339 <AtLoadMore status={this.state.status} noMoreTextStyle={{ 340 '100%', 341 lineHeight: '10px', 342 textAlign: 'center', 343 fontSize: '12px', 344 color: '#ccc', 345 border: 'none', 346 }} noMoreText='已无更多消息' moreBtnStyle={{ 347 '100%', 348 lineHeight: '10px', 349 textAlign: 'center', 350 fontSize: '12px', 351 color: '#ccc', 352 border: 'none', 353 }} 354 /> 355 </ScrollView> 356 357 <ScrollView 358 scrollY 359 scrollWithAnimation 360 scrollTop='0' 361 style={{height:'667px',marginTop:'44px'}} 362 lowerThreshold='20' 363 upperThreshold='20' 364 onScrollToLower={this.loadClick} 365 hidden={this.state.selectTabType==1?false:true} 366 > 367 { 368 mapListData.map((item,index) => { 369 item.pushTime = timeFormat(item.pushTime); 370 return <PersonNews key={index} isReaded={item.isReaded} title={item.title} describe={item.describe} pushTime={item.pushTime} ongoDetails={()=>this.goDetails(item.msgId)} /> 371 }) 372 } 373 <AtLoadMore status={this.state.statusCourse} noMoreTextStyle={{ 374 '100%', 375 lineHeight: '10px', 376 textAlign: 'center', 377 fontSize: '12px', 378 color: '#ccc', 379 border: 'none', 380 }} noMoreText='已无更多消息' moreBtnStyle={{ 381 '100%', 382 lineHeight: '10px', 383 textAlign: 'center', 384 fontSize: '12px', 385 color: '#ccc', 386 border: 'none', 387 }} 388 /> 389 </ScrollView> 390 </View> 391 ) 392 } 393 } 394 395 export default NewsInform
// index.module.scss文件是sass形式存在,想不用
className={styles.content}想用className='content'就需要用到:global{}来实现。
2.组件的开发和引入
import Taro, { Component } from '@tarojs/taro'
import { View, Text, Image } from '@tarojs/components'
import styles from './index.module.scss'
import spot from './spot.png'
export default class Feed extends Component {
render() {
return (
<View className={styles.feed} onClick={this.props.onEvent}>
<View className={this.props.isItem ? styles.item : styles.item1}>
<Text className={styles.text}>{this.props.name}</Text>
<Text className={styles.time}>{this.props.time}</Text>
<Image src={spot} className={styles.img} />
</View>
</View>
)
}
}
*注意onEvent必须是带on,taro框架限制了这一点;
3.数据需要共享的时候用的方法-----看黄色标注文字
*注意文件的层级关系最好同级,不然报错找不到;
4.周末继续补充