react 項目總結

前言

最近在寫一個項目,在寫react的過程中遇到過很多坑,現在總結一下,為以后的項目作參考.另外借此項目來比較一下 vue.js 和 react.js 之間的一些異同.

先說說組件

剛剛開始寫組件的時候,感覺難度不大(跟vue差不多)。最有意思的應該是jsx語法,個人感覺,jsx的功能性確實比vue的template更強,而且可讀性更高.

舉個栗子
// vue
<p :id="text" :class="{'active':isActive}" v-text="'hello! ' + msg"></p>
// jsx
<p id={text} className={isActive && 'active'}>hello !{msg}</p>
  1. 在jsx里面沒有指令,而且jsx里面 {} 代表要執行的js語句,它的效果類似 return ,它會有返回值.這樣的話,更好理解jsx的內容,jsx里面的dom不是真正的dom,只是一種表示dom的語法,{}里面的內容可以完全理解為js,這種整個jsx就可以完成理解為原生js寫的html模版.
  2. 屬性計算的部分,vue里面需要在屬性名前面加:,在jsx里面則不需要.
  3. 另外,在vue里面的dom的contentText不使用{{}}來渲染,使用因為在vue頁面生成之前,模版語法部分沒有渲染出來,就會在頁面上先出現{{content}},再一閃變成真正的文本內容.
再舉個數組遍歷渲染的栗子
// vue
<ul><li v-for="(item,index) in list" :key="index" v-if="showItem(item)"><span v-text="item.label"></span></li>
</ul>// vue的methods屬性
methods:{showItem(item){return item.label.indexOf('abc') !== -1}
}
// jsx
<ul>{list.map((item,index) => {return item.label.indexOf('abc') !== -1 && (<li key={index}><span>{item.label}</span></li>)})}
</ul>

你會發現,在一些比較簡單渲染需求時,使用vue的template會比較簡單直接,而且很易懂.但是如果涉及一些比較復雜的邏輯處理渲染,jsx更直觀,因為jsx的語法跟js的差異不大,相當于用js來描述需要如何渲染dom結構.當然jsx并不是說可以完成使用js的語法來寫dom,{}里面只能是一個表達式,所以像if else或者switch這種語法在{}是不能用的.

redux

在寫redux的時候,不是很習慣。后來慢慢的去適應。由于還用到了saga,以至于書寫方法上與redux官方的推薦的有所不同。

'action type'定義的不同類型。
  1. action ===> reducer
  2. action ===> saga ===> reducer

第一種情況:觸發action之后直接commit一個reducer

// action
{type:'do/update-some-data',payload}

第二種情況,觸發的action會被saga攔截,然后saga完成一定的操作后(一般是從后臺獲取數據);put一個action,作用到reducer

// saga action
{type:'start/get-some-data',payload}// reducer action
{type:'success/get-some-data',payload}
{type:'failed/get-some-data',payload}
{type:'error/get-some-data',payload}

一些代碼書寫規范

因為以前在寫代碼的時候一直都沒有確定好一個規范,導致代碼風格一直有變化(已經被同事吐槽好幾次了)。后來在這個項目里面看了其他的同事的代碼再結合網上推薦的一些代碼規范,目前總結出一些小心得(也不算什么心得)。

1.還是從組件開始

  1. 組件注釋
  2. 模塊引入
  3. 內部方法
  4. 組件類定義
  5. redux select
  6. export
1.注釋的問題我個人一直都重視的,一份好的注釋可以讓別人在開始看代碼之前就能對內容有一個大概清晰的了解。
/*** @name:組件名稱* @author:誰維護的* @version:2017-12-28 日期或者版本號* @description:描述* 你會發現沒有’param‘,這個部分在組件定義的地方會提到。*/

這些只是基本的信息,還可以添加其他你想加的內容。

2.模塊引入的部分一般有這些分類
  1. 依賴。例如庫或者插件
  2. 子組件
  3. 資源文件。例如默認的圖標或者背景圖什么的。
3.內部方法

內部方法一般是針對該組件需要的功能而定義的,而且不想跟類一起export出去。比如,組件里拿到后臺的一個對象數組,需要根據這個數組的信息計算出一個值,然后在組件中使用。
如果這個方法在多個組件中使用到的話,還可以把它提到utils文件夾中。

4.組件定義
一般情況下,組件都會使用類來定義。比如:
class MyComponent extends Component{static defaultProps = {a:0,b:1}constructor(props) {super(props)this.state = {c:2,d:3}}handleClick = () = >{// some stuff}render() {const {a,b} = this.propsconst {c,d} = this.stateconst e = falsereturn(<div><div a={a} b={b}></div><div {...{a,c}}></div><div {...this.props} {...this.state}></div>e && {<div>some code</div>}</div>)}
}

首先,為啥子要寫defaultProps?我覺得,有兩點:

  1. 知道在使用這個組件的時候,應該傳入哪些參數,都有什么意義。這樣比在組件頭注釋寫更具體。
  2. 設置默認值,避免使用時沒有傳參,導致一些bug。

state就略過了。

類的方法。這里使用了箭頭函數來定義,主要是為了使用this,因為大多數情況下,handle里面都會調用this.setState,這樣寫就不需要去constructor一個個bind(this)了。其實如果方法里面沒有使用指向類的this,用函數定義的方式也是可以的。

render部分。我一般習慣將使用到的propsstate以及其他的數據全部在return前定義出來。這樣會更清晰明白組件里面使用了哪些數據。
另外是給元素設置屬性的一些小技巧。平時最常用的方式是這樣的key={value},還可以使用對象解構的方式設置屬性。

redux seletct & export

說到redux一定要扯上vuex(看完下面的內容,如果有不同意見的戰友,請不要打我)。
這里先從組件部分來看一下reduxvuex的區別。在組件里面主要是看如何讓當前組件使用到store中的數據和方法。

// react
import React, { Component } from 'react'
import { connect } from 'react-redux'
import * as actions from '../actions'
import { bindActionCreators } from 'redux'class MyComponent extends Component{}function mapStateToProps(state){return {...state,stateOne:state=>state.stateOne,stateTwo:state=>state.stateTwo}
}
functino mapDispatchToProps(dispatch){return {...bindActionCreators(actions,dispatch),handleOne:(arg)=>dispatch(actions.handleOne(arg)),handleTwo:(arg)=>dispatch(actions.handleTwo(arg))}
}export connect(mapStateToProps,mapDispatchToProps)(MyComponent)

react里面要使用connect方法把state和dispatcher和當前組件連接起來.

// vueimport { createNamespacedHelpers } from 'vuex'
const { mapState, mapActions } = createNamespacedHelpers('theModule')export default {computed:{...mapState(['stateOne','stateTwo']),...mapState({stateThree:state=>state.theModule.stateThree,stateFour:state=>state.theModule.stateFour})},methods:{...mapActions(['handleOne','handleTwo']),...mapActions({handleThree:'actionThree',handleFour:'actionFour'})}
}

在vue里面也有相應的輔助函數,而且vuex的store包含來數據和方法,在根組件注入之后,所有的子組件都可以通過this.$store使用,輔助函數只是用來過濾而已.

待續...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

現代數字影視 電影使用標準

1、國際數字電影標準1&#xff09;DCI&#xff08;Digital Cinema Initiatives數字影院系統規范&#xff09;美國好萊塢七大制片公司——Disney、MGM、Fox、Paramount Pictures、Sony Pictures Entertainment、Universal Studios和Warner Bros于2002年聯合成立了DCI機構&#x…

數據流圖 系統流程圖 程序流程圖 系統結構圖聯系與區別

1.數據流圖&#xff08;Data Flow Diagram&#xff09;&#xff0c;簡稱DFD&#xff0c;它從數據傳遞和加工角度&#xff0c;以圖形方式來表達系統的邏輯功能、數據在系統內部的邏輯流向和邏輯變換過程&#xff0c;是結構化系統分析方法的主要表達工具及用于表示軟件模型的一種…

Linux--安裝yum源

linux配置yum源 一、修改yum的配置文件 /etc/yum.repos.d/xxx.repo 1、進入yum配置文件目錄 # cd /etc/yum.repos.d 2、刪除全部原有的文件 # rm -rf * 3、新建一個yum的配置文件 # vi my.repo [myrepo] 標識配置文件名稱&#xff08;名字隨意&#xff09; namemyrepo 標識yum …

在 Confluence 6 中禁用 workbox 應用通知

如果你選擇 不提供應用通知&#xff08;does not provide in-app notifications&#xff09;&#xff1a; Confluence workbox 圖標將不會可見同時用戶也不能在這個服務器上訪問 workbox。這個 Confluence 服務器將不會發送消息到 workbox 中&#xff0c;同時也不會發送消息到其…

迄今為止最快的 JSON 序列化工具 Jil

2019獨角獸企業重金招聘Python工程師標準>>> 迄今為止最快的 JSON 序列化工具 Jil https://github.com/kevin-montrose/Jil 轉載于:https://my.oschina.net/xainghu/blog/1621365

mysql數據庫訪問編程,mysql 連接數據庫

1、首先啟動mysql 并鏈接數據 小意思吧&#xff01;都會了是吧mysql -uroot -p //連接數據net start mysql // 啟動mysql2、查詢當前 服務器里有哪些數據show databases;3、創建數據庫create database jddb -------數據庫名字(jddb)4、 使用數據庫use jddb;5、查詢當前數據庫下…

linux多線程 pthread用法

#include int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg); Returns: 0 if OK, error number on failure 第一個參數為指向線程標識符的指針。 第二個參數用來設置線程屬性。 第三個參數是…

什么是數據字典

數據字典是指對數據的數據項、數據結構、數據流、數據存儲、處理邏輯、外部實體等進行定義和描述&#xff0c;其目的是對數據流程圖中的各個元素做出詳細的說明。 數據字典最重要的作用是作為分析階段的工具。任何字典最重要的用途都是供人查詢對不了解的條目的解釋&#xff0c…

Flsak愛家租房--個人信息

0.頁面展示效果 1.設置用戶頭像–后端代碼 # coding:utf-8from . import api from ihome.utils.commons import login_required from flask import g, current_app, jsonify, request, session from ihome.utils.response_code import RET from ihome.utils.image_storage impo…

json返回值為null顯示key值的設置

使用的是阿里的json ----------com.alibaba.fastjson.JSONObject; Map<String,Object> map new HashMap<String,Object>(); return JSONObject.toJSONString(map); --------轉義的時候&#xff0c;map中值是null的字段會被忽略掉&#xff0c;轉義的json沒有帶n…

C++ string::size_type

從邏輯上講&#xff0c;size()成員函數應該似乎返回整型數值&#xff0c;但事實上&#xff0c;size操作返回是string::size_type類型的值。string類類型和其他許多庫類型都定義了一些配套類型(companion type)。通過這些配套類型&#xff0c;庫函數的使用就與機器無關(machine-…

需求分遵循的準則

?必須理解并描述問題的信息域&#xff0c;根據這條準則應該建立數據模型。 ?必須定義軟件應完成的功能&#xff0c;這條準則要求建立功能模型。 ?必須描述作為外部事件結果的軟件行為&#xff0c;這條準則要求建立行為模型 ?必須對描述信息、功能和行為的模型進行分解&…

MATLAB顯示錯誤使用untitled,新手,用gui界面畫李薩如圖,出錯,求解答

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓function varargout untitled1(varargin)% UNTITLED1 MATLAB code for untitled1.fig% UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing% singleton*.%% H UNTITLED1 returns the handle to a new UNTITL…

軟件開發如同木匠做桌子

做一張桌子看起來十分的簡單。任何人都可以做&#xff0c;不是嗎&#xff1f;找個大塊的四方形木板&#xff0c;四個等長的木頭柱子&#xff0c;四個釘子和一個錘子。把四個柱子釘到四方板的四個角上&#xff0c;你就做成了一個桌子。當當當&#xff01; 現在來讓一個真正的木…

Django加載靜態文件

方法一: 1.在app目錄中創建static 目錄&#xff0c;并在該目錄下創建存儲css,img,js的子目錄&#xff0e; 2.在相應的目錄下創建相對應的靜態文件. static/css/mystyle.css, static/img/timg.jpg,(保存圖片) static/js/myjs.js 3.在模板文件中加載靜態文件 例: mystyle.css: bo…

Flsak愛家租房--實名認證

0.頁面展示效果 1.設置用戶實名認證信息–后端代碼 api.route("/users/auth", methods["POST"]) login_required def set_user_auth():"""保存實名認證信息"""user_id g.user_id# 獲取參數req_data request.get_json()if …

IntelliJ 啟動不同端口的兩個spring cloud項目

IntelliJ 啟動不同端口的兩個spring cloud項目 1&#xff0c;使用maven進行clean package 2&#xff0c;在Terminal界面&#xff0c;輸入java -jar xxx.jar --server.port8001就可以更換server的啟動端口了&#xff1b;

python sort怎么用,Linux Sort命令詳細用法(有實例)

Linux Sort命令詳細用法(有實例)sort是在Linux里非常常用的一個命令&#xff0c;管排序的&#xff0c;集中精力&#xff0c;五分鐘搞定sort&#xff0c;現在開始&#xff01;Linux sort命令進階&#xff1a;1 sort的工作原理sort將文件的每一行作為一個單位&#xff0c;相互比較…

需求分析階段各種圖的功能

實體聯系圖&#xff0c;描繪數據對象及數據對象之間的關系&#xff0c;是用于建立數據模型的圖形。數據流圖是建立功能模型的基礎。狀態轉換圖描繪了系統的各種行為模式和在不同狀態間轉換的方式。

python面試題總結(7)--操作類

1. Python 交換兩個變量的值 答&#xff1a;在 Python 中交換兩個對象的值通過下面的方式即可 a , b b ,a 但是需要強調的是這并不是元組解包&#xff0c;通過 dis 模塊可以發現&#xff0c;這是交換操作的字節碼是 ROT_TWO&#xff0c;意思是在棧的頂端做兩個值的互換操作。…