react全家桶实战

react全家桶实战Tab jsimportReac Component from react import Link NavLink from react router dom exportdefaul constructor super render

package.json代码如下:

{ "name": "active", "version": "0.1.0", "private": true, "dependencies": { "react": "^16.4.1", "react-dom": "^16.4.1", "react-redux": "^5.0.7", "react-router-dom": "^4.3.1", "react-scripts": "1.1.4", "react-swipe": "^5.1.1", "react-transition-group": "^2.3.1", "redux": "^4.0.0", "redux-logger": "^3.0.6", "redux-promise": "^0.6.0", "redux-thunk": "^2.3.0", "swipe-js-iso": "^2.0.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }, "proxy": { "/api": { "target": "http://localhost:1000/", "changeOrigin": true, "pathRewrite": { "/api": "/" } } }, "devDependencies": { "babel-plugin-transform-decorators-legacy": "^1.3.5" } }

api/home.js(在redux中的action中被引入store/actions/home.js)用来获取首页数据


//获取轮播图数据 function getSilders() { //最原始的fetch // fetch('api/loop', {method: "post"}).then(function (response) { // // 转换为 JSON // console.log("response") // console.log(response) // return response.json(); // }).then(function (j) { // console.log('获取到的数据是===='); // console.log(j); // return j // }); redux-promise的用法:可以将payload中的promise执行,执行后将内容放到action.payload中进行派发:{ type:SET_SLIDERS, patload:[{},{},{},{}] } return fetch('api/loop', {method: "post"}) } export { getSilders }

common/Tab/Tab.js;在app.js中被引入;作为底部导航;切换主页面

import React,{Component} from 'react' import {Link,NavLink} from 'react-router-dom' export default class Tab extends Component{ constructor(){ super() } render(){ return ( <ul> <li><Link to={'/'}> 首页 
   Link> 
   li> <li><Link to={'/lesson'} >课程  
   Link> 
   li> <li><Link to={'/profile'} > 用户中心 
   Link> 
   li> {/*第二种写法如下:*/} {/*<li> <NavLink to={'/'}>首页 
   NavLink>  
   li>*/} {/*<li> <NavLink to={'/lesson'}>课程 
   NavLink>  
   li>*/} {/*<li> <NavLink to={'/profile'}>用户中心 
   NavLink>  
   li>*/}  
   ul> ) } } 

containers/Home/Homeheader/Homeheader.js;被Home.js被引入

import React, {Component} from 'react' import logo from '../../../common/img/logo.png' import './index.css' import Transition from 'react-transition-group/Transition'; const duration = 10; //默认样式 const defaultStyle = { transition: `opacity ${duration}ms ease-in-out`, opacity: 0, display:'none' } const transitionStyles = { entering: { 
  opacity: 0}, entered: { 
  opacity: 1}, }; export default class Homeheader extends Component { 
    constructor() { super() this.state = { isShow: false } } changeShow = () => { this.setState({ isShow: !this.state.isShow }) } selectLesson=(e)=>{ //li元素,当前点击的元素是谁就是谁 // console.log(e.target) // //整个ul元素。事件在谁身上绑着就是谁 // console.log(e.currentTarget) // //获取h5 data属性 // console.log(e.target.dataset.type) //隐藏元素 this.changeShow() this.props.selectCurrentLesson(e.target.dataset.type) } render() { return ( 
  
'home-header'}>

this.changeShow} className={ 'iconfont icon-menu menu'}> 'logo'} src={logo} alt=""/>

in={ this.state.isShow} timeout={duration} onEnter={ (node)=>{ node.style.display= 'block' }} onExited={ (node)=>{ node.style.display= 'none' }}> { (state) => (
    'menu-ul'} style={ { ...defaultStyle, ...transitionStyles[state] }} onClick={ (e)=>{ this.selectLesson(e) }} >
  • "all">全部课程
  • "react">react课程
  • "vue">vue课程
)}
) } }

containers/Home/Home.js;路由‘/’的组件

import React, {Component} from 'react' import './index.css' import Homeheader from './Homeheader/Homeheader' import {connect} from 'react-redux' import HomeSlider from './HomeSlider' import Loading from '../../components/Loading' import actions from '../../store/actions/home' //修饰符的用法待研究 @connect(state => ({...state.home}), actions) export default class Home extends Component { 
    // constructor(){ 
    // super() // } componentWillMount() { // 第一种方法:直接ajax // fetch('api/loop', {method: "post"}).then(function (response) { 
    // // 转换为 JSON // return response.json(); // }).then(function (j) { 
    // console.log(j); // }); // 第2种方法:ajax从外部引入 // getSilders() // 第3种方法:采用redux;只有connect装饰器以后才能使用redux中的store;如果redux中存在数据;则不进行请求 if (this.props.slider.length === 0) { this.props.getSliderApi() } } selectCurrentLesson = (val) => { // console.log('传给父组件的值是'+val) console.log(this.props) this.props.updateCurrentLesson(val) } render() { return ( 
  
this.selectCurrentLesson}> //解决轮播图不出现的BUG { this.props.slider.length> 0 ? this.props.slider}> : }
) } }

containers/Lesson/Lesson.js;路由‘/lesson’的组件

import React,{Component} from 'react' import './index.less' export default class Lesson extends Component{ 
    // constructor(){ 
    // super() // } render(){ return ( <div> Lesson 
  div> ) } } 

containers/Profile/Profile.js;路由‘/Profile’的组件

import React,{Component} from 'react' import './index.less' export default class Profile extends Component{ 
    // constructor(){ 
    // super() // } render(){ return ( <div> Profile 
  div> ) } } 

store/actions/home.js;在Home.js中被引入;

import * as Types from '../action-types' import { getSilders } from '../../api/home' let actions={ //更新当前选择的课程 updateCurrentLesson(lesson){ return { type:Types.SET_CURRENT_LESSON, lesson } }, getSliderApi(){ // redux-thunk return function (dispatch,getState) { 
    //redux-promise的用法:可以将payload中的promise执行,执行后将内容放到action.payload中进行派发:{ type:SET_SLIDERS, patload:[{},{},{},{}] } dispatch({type:Types.SET_SLIDERS ,payload:getSilders().then(function (response) { 
    // 转换为 JSON console.log("response") console.log(response) if(response.status==200){ return response.json(); }else{ alert('服务器挂掉了') } }).then(function (j) { 
    // console.log('获取到的数据是===='); // console.log(j); return j })}) } } } export default actions

store/reducers/home.js;在下面的index.js中被引入;

//一个页面一个reducer import * as Types from '../action-types' let initState={ currentLesson:'all', slider:[] } function home(state=initState, action) { 
    switch (action.type){ case Types.SET_CURRENT_LESSON: return { ...state, currentLesson:action.lesson } case Types.SET_SLIDERS: return { ...state, slider:action.payload } default:{ return state } } } export default home 

store/reducers/index.js;在store中index.js中被引入;

import { combineReducers } from 'redux' import home from './home' export default combineReducers({ home })

store/action-types.js;在store中的各种JS文件中引入;

//设置当前课程 export const SET_CURRENT_LESSON='set_current_lesson' //设置轮播图数据 export const SET_SLIDERS='set_sliders'

store/index.js;被最外层的index.js引入

import { createStore , applyMiddleware } from 'redux' import reduxLogger from 'redux-logger' import reduxThunk from 'redux-thunk' import reduxPromise from 'redux-promise' import reducer from './reducers/index' let store= createStore(reducer,applyMiddleware(reduxLogger,reduxThunk,reduxPromise)) window._store=store; //为了测试用 export default store

架构最外层的index.js

import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; import registerServiceWorker from './registerServiceWorker'; //配置路由组件 import {HashRouter as Router,Route, Switch} from 'react-router-dom' import Home from './containers/Home/Home' import Profile from './containers/Profile/Profile' import Lesson from './containers/Lesson/Lesson' import {Provider} from 'react-redux' import store from './store/index' import './common/reset.css' ReactDOM.render( 
   
    
     
      
      
        '/' exact={ 
        
       true} component={Home}> 
       
      
        '/lesson' component={Lesson}> 
       
       
       '/profile'} component={Profile}> 
       
      
     
    
   , document.getElementById('root')); registerServiceWorker(); 

架构最外层的app.js

import React, { Component } from 'react'; import Tab from './common/Tab/Tab' class App extends Component { 
    render() { return ( <div> { 
  this.props.children} 
   
  div> // 
   
// {this.props.children} // // ); } } export default App;

HomeSlider.js

import React,{Component} from 'react' //轮播图组件 import ReactSwipe from 'react-swipe'; export default class HomeSlider extends Component{ 
    constructor(){ super() this.state={ index:0 } } render(){ let _this=this let opts={continuous: true, speed: 400, auto: 1000, callback: function(index, elem) { _this.setState({ index:index }) }, } return ( <div className={ 
  'loop'}> 
  
    "carousel" swipeOptions={opts}> { 
   this.props.lists.map((item, 
   index) => { 
   return ( < 
   div key={ 
    
   index}> 
   <span""/> 
    div> ) }) }  
   <div className={ 
  'slider-dots'}> { this.props.lists.map((item, index) => { return ( index} className={ 
   this.state.index===index ? 'active': ''}> ) }) } 
  div> 
  div> ) } }

1:轮播图插件

npm install react swipe-js-iso react-swipe
 delay = options.auto || 0;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227345.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:31
下一篇 2026年3月16日 下午9:31


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号