国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

工作流程

Chiclaim / 956人閱讀

摘要:引入引入組件和綁定結構頁面組件這個組件引入做連接引入中的函數到中處理數據獲取中的數據組件上會受到發來的數據包含發來的信息定義函數定義字段字符串定義的函數返回一個高階函數傳入和再到處理數據出字段和函數供和組件使用類型的請求或者不需要將數

main.js

1.引入Route,createStore,combineReducers

const {Router, Route, Redirect, IndexRoute, browserHistory} = ReactRouter;
const {Provider, connect} = ReactRedux;
const { createStore, combineReducers, applyMiddleware, compose} = Redux;
const {syncHistoryWithStore, routerMiddleware, routerReducer, push } = ReactRouterRedux;
const thunkMiddleware = require("redux-thunk");

2.引入組件和reducer

const DanbaiPacket = require("Containers/DanbaiPacket");
const DanbaiPacket = require("Containers/DanbaiPacket");

3.綁定reducer,store

const reducer = combineReducers({
  routing: routerReducer,
  localizationReducer: LocalizationReducer,
  accountReducer: AccountReducer,
  notificationReducer: NotificationReducer,
  headlineDetailReducer: HeadlineDetailReducer,
  headlineEditorReducer: HeadlineEditorReducer,
  headlineListReducer: HeadlineListReducer,
  userCollectionsReducer: UserCollectionsReducer,
  userArticlesReducer: UserArticlesReducer,
  signInPopupReducer: SignInPopupReducer,
  notifyMessageReducer: NotifyMessageReducer,
  redPacketReducer: RedPacketReducer,
  danbaiPacketReducer: DanbaiPacketReducer
});

const middleware = routerMiddleware(browserHistory);
let initState = {};

let store = createStore(
    reducer,
    {},
    compose(
      applyMiddleware(thunkMiddleware, middleware),
      (window.RAILS_ENV === "development" && window.devToolsExtension) ? window.devToolsExtension() : f=>f
    )
);

4.Router結構

var routes = (
  
    
      
        
        
        
        
          
          
        
        
        
      
    
  
);
頁面組件

1.define這個組件
引入routerAction, connect做reducer連接
引入action中的函數getDanbaiPacket,dispatch到action中處理數據
this.props獲取reducer中的數據
組件上componentWillReceiveProps會受到reducer發來的數據,nextProps包含發來的信息.

define("Containers/DanbaiPacket", function(require, exports) {
  const { routerActions } = ReactRouterRedux;
  const { connect } = ReactRedux;
  const { getDanbaiPacket } = require("Actions/DanbaiPacketAction");

  var DanbaiPacket = React.createClass({
    getInitialState: function() {
      return {

      };
    },
    componentDidMount: function() {
      this.props.dispatch(getDanbaiPacket(this.props.params.id));
    },
    render: function() {
      const { localization, current_account, danbaiPacketDetail } = this.props;
      
      return (
        
aaa
); } }); function mapStateToProps(state, ownProps) { return { localiztion: state.localizationReducer.languages[state.localizationReducer.languages.current], current_account: state.accountReducer.current_account, danbaiPacketDetail: state.danbaiPacketReducer.danbaiPacketDetail }; } return connect(mapStateToProps)(connect(null, routerActions)(DanbaiPacket)); });

2.action
定義Action函數
定義type字段字符串
定義dispatch的函數,返回一個高階函數,傳入dispatch和getState,再dispatch到reducer處理數據
return出type字段和函數,供reducer和組件使用.
post類型的請求,或者不需要將數據掛載到reducer函數上的,不需要dispatch到reducer處理,直接用callback處理返回的數據.

//= require ../../util/fetch_posts
//= require ./notify_message_action

define("Actions/DanbaiPacketAction", function(require, exports) {
  const fetch = require("util/FetchPosts");
  const { addNotifyMesaage } = require("Actions/NotifyMessageAction");
  const INIT_DANBAI_PACKET = "INIT_DANBAI_PACKET";

  function initDanbaiPacket(data) {
    return {
      type: INIT_DANBAI_PACKET,
      data: data
    };
  }

  function getDanbaiPacket(id, callback) {
    return (dispatch, getState) => {
      fetch.get({
        url: "/api/events/" + id + ",json",
        dataType: "json",
        data: {
          sonkwo_client: "web"
        },
        success: function(res) {
          dispatch(initDanbaiPacket(res))
        },
        error: function(xhr) {
          if (xhr.status === 404) {
            dispatch(addNotifyMesaage("wufazhaodaoziyuan"));
          }
        }
      });
    }
  }

  return {
    INIT_DANBAI_PACKET,
    getDanbaiPacket
  }
});

3.reducer
從action引入type字符串
定義reducer函數,即可以在組件中被獲取的數據
每個reducer函數都會return出一個對象,這就是這個函數的值,要用Object.assign({}, state, action.data)
state的值會變化,直接action.data的話,那就只有這一個值.
可以用Object.assign({}, state, {rules: action.data}),
這樣掛載再reducer函數上的key為rules.
只要掛載再reducer函數上的key值有變化,只要有dispatch,就會觸發組件render
即使有兩個reducer處理函數,也是以dispatch為準,dispatch后會觸發reducer處理函數,觸發組件render.

//= require ../actions/danbai_packet_action

define("Reducers/DanbaiPacketReducer", function(require, exports) {
  const { INIT_DANBAI_PACKET } = require("Actions/RedPacketAction");
  const { combineReducers } = Redux;

  function danbaiPacketDetial(state={}, action) {
    switch (action.type) {
      case INIT_DANBAI_PACKET:
        return Object.assign({}, state, action.data);
      default:
        return state;
    }
  }

  return combineReducers({
    danbaiPacketDetial: danbaiPacketDetial
  });
});

4.子組件
define子組件
使用解構賦值,給rules初始值
也可以使用componentWillReceiveProps

define("Components/Example", function(require, exports) {
  var Example = React.createClass({
    getInitialState: function() {
      return {

      };
    },
    componentWillReceiveProps: function() {

    },
    componentDidMount: function() {

    },
    render: function() {
      const { rules = [] } = this.props;

      return (
        
example { rules.map((item, index) => { return (
id: { item.id }, type: { item.type }
) }) }
); } }); return Example; });

在父組件中引入,傳入danbaiPacketDetail.rules

問題總結

1.所有請求都把數據掛在了reducer函數上,且都直接返回,造成數據雜糅,key值沖突,不易處理邏輯,
又造成重復render.
解決:

1.post請求或者不需要處理返回數據的,直接callback執行回掉,在action中不需要dispatch到reducer處理.
2.reducer處理數據時,return出來的值整個值,使用Object.assign({}, state, action.data),把數據
全部返回.

2.Modal的ErrorPopup只需要有一個,error為this.state.error,mode為"simple"則樣式自己寫.
層疊順序為:SignInPopup > ErrorPopup > 自身的modal
3.this.props.params.id,this.props.location.query只能在Route中的組件獲取.
4.對每個接口做錯誤處理.
5.對一些可能先返回undefined的值做保護,可以用解構賦值初始值.

const {a = []} = this.props;

6.post之后一般有回調,再重新dispatch獲取接口,或者直接在post接口中callbackc處理.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84260.html

相關文章

  • Activiti就是這么簡單

    摘要:介紹什么是是由軟件在年月日發布的業務流程管理框架,它是覆蓋了業務流程管理工作流服務協作等領域的一個開源的靈活的易擴展的可執行流程語言框架。第二部分是表示表的用途的兩個字母標識。 Activiti介紹 什么是Activiti? Activiti5是由Alfresco軟件在2010年5月17日發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈...

    everfly 評論0 收藏0
  • 使用Python批量處理工作簿和工作

    摘要:使用批量處理工作簿和工作表批量新建并保存工作簿批量打開一個文件夾中的打開工作簿批量重命名一個工作簿的所有工作表批量重命名多個工作簿批量重命名多個工作簿中的同名工作表將一個工作簿的所有工作表批量復制到其他工作簿按條件將一 ...

    maxmin 評論0 收藏0
  • Activiti工作流從入門到入土:完整Hello World大比拼(Activiti工作流 API

    摘要:通過流程引擎獲取了一個對象倉庫對象由倉庫的服務對象產生一個部署對象配置對象,用來封裝部署操作的相關配置。輔導員審批的審批人員是歐陽思海。部署流程定義從與流程定義和部 文章源碼托管:https://github.com/OUYANGSIHA...歡迎 star !!! 本來想著閑來無事,前面在項目中剛剛用到了工作流 Activiti 框架,寫寫博客的,但是,事情總是紛紛雜雜,一直拖延到現...

    ghnor 評論0 收藏0
  • 請不要怪罪流程

    摘要:但流程不是死的,尤其在互聯網公司,只要有助于我們的目標達成,那么流程只是一陣東風。工作中并不是所有事情都可以依賴流程去保證萬無一失。所以不要怪罪流程,這并不是流程的問題,而是人的問題。所以請不要再怪罪流程啦,以人為本,才是長久之計。 本文由作者周巧芬授權網易云社區發布。 筆者所在的團隊這段時間正在兩個版本的交接期,前一個版本馬上要上線了,但后一個版本的需求早在三周前就已經啟動,卻遲遲沒...

    MiracleWong 評論0 收藏0
  • PHPOA辦公系統:新型工作流引擎4.0,快速提升OA辦公方式

    摘要:更嚴重的是,會導致信息系統的失控。實現了數據的同步交換和共享,從而簡化多余流程,消除重復工作,有效提升工作效率和精度。工作流將大大深化系統的應用,讓系統發揮出全新的價值。而不具有工作流特點的系統,將很快被時代所拋棄。 一、工作流1.0時代終結OA系統的應用正在不斷深化,正在逐漸完成從無紙化到智能化的轉變,作為OA系統應用的核心,工作流技術也同樣發生了很大的轉變。 我們知道,對工作流比較...

    afishhhhh 評論0 收藏0
  • Activiti工作流從入門到入土:工作流簡介

    摘要:基于許可的開源平臺,創始人是的項目架構師,它特色是提供了插件,開發人員可以通過插件直接繪畫出業務流程圖。二工作流引擎對象,這是工作的核心。五總結工作流的概念就先介紹這么多了,更多的去官網查看,下一節將用一個入門的實例來對工作流進行講解。 文章源碼托管:https://github.com/OUYANGSIHA...歡迎 star !!! 一、activiti介紹 Activiti5是由...

    Mr_houzi 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<