React 常見知識點(diǎn)匯總

刪除工程依賴

rm -f /node_modules

1.適配

rem與px互換

1rem等于html根元素設(shè)定的font-size的px值,假如我們在css里面設(shè)定下面的css。

html{font-size:14px}

那么后面的CSS里面的rem值則是以這個14來換算,例如設(shè)定一個div寬度為3rem,高度為2.5rem.則它換算成px為width:42px.height:35px,同理,假如一個設(shè)計稿為寬度42px,高度為35px,則換成成rem,則是42/14=3rem,35/14=2.5rem。

如果css里面沒有設(shè)定html的font-size,則默認(rèn)瀏覽器以1rem=16px來換算。

現(xiàn)在使用

常規(guī)適配

rem實(shí)現(xiàn)移動端自適應(yīng)

2.定位和樣式問題

1.子元素相對父元素居中,相對定位

<style>
.album-img {
    position: relative;
    display: flex;
    justify - content: center;
}
.diary-control {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    justify - content: center;
}
</style>

2.設(shè)置字體垂直居中

line-height: 100%;

3.圓角設(shè)置

設(shè)置寬度一般,圓形

border-radious: 100%;

3.div 嵌套 img 標(biāo)簽,底部有白底

1.是圖片的底就得重新做圖
2.是樣式的底的話就把樣式的背景色去掉
3.子標(biāo)簽沒有顏色,其他標(biāo)簽有顏色也會覆蓋.

4.div子標(biāo)簽水平排布

<style>
.userHeader {
    display:flex;
    img {
    margin - left:1.63 rem;
    background - color:lightgray;
    width:3.63 rem;
    height:3.63 rem;
    border - radius:1.82 rem;
}
.label {
    margin - top:1.06 rem;
    margin - left:1.63 rem;
    color:#FFFFFF;
    flex:1;
    text - align:center;
    justify - content:center;
}
}</style>

5.React添加百度統(tǒng)計代碼

  • 頁面埋點(diǎn)
  • 點(diǎn)擊事件埋點(diǎn)

語法

_hmt.push(['_trackEvent', category, action, opt_label, opt_value]);

舉例

_hmt.push(['_trackEvent', 'music', 'play', 'Hey Jude']);

category    必選  String  要監(jiān)控的目標(biāo)的類型名稱 不填、填"-"的事件會被拋棄
action  必選  String  用戶跟網(wǎng)頁進(jìn)行交互的動作名稱  不填、填"-"的事件會被拋棄
opt_label   可選  String  事件的一些額外信息   不填、填"-"代表此項(xiàng)為空
opt_value   可選  Number  跟事件相關(guān)的數(shù)值

實(shí)現(xiàn)代碼

componentDidMount() {
      this.baiduStatistics();
      this.handlePageCounts();
  }

 /**
 * 百度統(tǒng)計初始化
 */
export function baiduStatistics() {
  var _hmt = _hmt || [];
  (function() {
    var hm = document.createElement("script");
    hm.src = "https://#/hm.js?18fd37d414145c525285e6cf0f11dada";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
}
  
  //頁面訪問量
  handlePageCounts() {
    setTimeout(function(){
      window._hmt.push(['_trackEvent', "pageName", "頁面訪問", "訪問量",1]);
    },500)
  }

/**
 * 發(fā)送事件分析
 * @param pageName  頁面名稱
 * @param action    動作
 * @param flag      標(biāo)簽/id
 */
export function baiduStatisticsBehaviour(pageName, action, flag) {
  if(typeof window._hmt == 'undefined') return;
  window._hmt.push(['_trackEvent', pageName, action, flag,1]);
}
//使用:
baiduStatisticsBehaviour('XXX落地頁','行為描述','標(biāo)記名稱')
//注意,不同的域名,他的token值是不一樣的,需要區(qū)分,頁面訪問展示很快,點(diǎn)擊事件需要兩個小時以后才可以展示在百度后臺數(shù)據(jù)上

參考文檔

6.React加載帶<br/>的字符串

let data = "1.在語音日記中可以記錄生活、故事、詩詞、繞口令、笑話、外語、朗誦等。<br/><br/> 2.每人每天最多記錄兩條日記,包括已刪除的日記。<br/><br/>3.日記時長限制在10秒至3分鐘。"
<div className="activityDetail">
    <div className="detail" dangerouslySetInnerHTML={{ __html: data}}>
    </div>
</div>

7.去掉微信簽名-方便調(diào)試

componentDidMount() {
    let sign = getQueryString('sign') || Cookies.get('sign')
    //if (sign) {
      this.requestList()
      this.initPlay()
      advert({
        operate: 'diarymission',
        label: 'open_diary_page',
      }).then((res) => {})
    //}
  }

8.圖片添加自旋轉(zhuǎn)動畫

<style>
.App-logo {
  animation: App-logo-spin infinite 20s linear;
  height: 40vmin;
  pointer-events: none;
}
@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
</style>

9.react使用引入svg的icon;svg圖形制作

https://blog.csdn.net/weixin_34319817/article/details/86017954

10.數(shù)據(jù)驅(qū)動UI,根據(jù)返回數(shù)據(jù)創(chuàng)建多個標(biāo)簽

//用戶頭像For
import UserHeader from '../../components/groupbuy/UserHeader'
//定義數(shù)據(jù)源
persons: [
          "周家大小姐",
           "陳家大小姐",
          "王家大小姐",
        ]
<div className="buyNumbers">
    <div className="nums">
      {
        persons.map((person) => {
          console.log("person"+person);
          return (
            // 對map 循環(huán)出來的每個屬性插入標(biāo)簽元素
            <UserHeader  name={person}   />
          )
        })
      }
    </div>
    <div className="desc">{"等N人已購買"}</div>
</div>

11.React 單頁應(yīng)用中,使用less寫樣式,公共樣式文件重復(fù)載入(樣式名沖突導(dǎo)致界面引用錯亂)

解決辦法

react中css設(shè)置作用域
Less 中的作用域與編程語言中的作用域概念非常相似。首先會在局部查找變量和混合,如果沒找到,編譯器就會在父作用域中查找,依次類推

//定義scope
@var: red;

#page {
  @var: white;
  #header {
    color: @var; // white
  }
}

#mynamespace { 
    .home {} 
    .user {} 
}
這樣我們就定義了一個名為 mynamespace 的命名空間,如果我們要復(fù)用 user 這個選擇器的時候,
我們只需要在需要混入這個選擇器的地方這樣使用就可以了。#mynamespace > .user。
#circle(@size: 25px){
    background-color: #4CAF50;
    border-radius: 100%;

    width: @size;
    height: @size;
}

#small-circle{
    #circle
}

#big-circle{
    #circle(100px)
}

第二種

在標(biāo)簽名后?-container
例如

<style>
.special-container{
  padding: 0 1rem;
  .banner{
    height: 100%;
    width: 100%;
    margin-top: 1rem;
    box-shadow: 0 .125rem .625rem 0 rgba(0,0,0,0.10);
    border-radius: .375rem;
    img{
      width: 100%;
      height: 8.4375rem;
      border-radius: .375rem;
    }
  }
  }
</style>

12.測試開發(fā)之switch-case語法

1.props定義屬性:pageState

constructor(props) {
    super(props);
    this.state = {
        pageState: "0",        
    }
  }

2.render 修改

<div>
    {( ()=>{
        switch(this.state.pageState){
          case "0":return <img src={gift1}/>; break;
          case "1":return <img src={gift2}/>; break;
          case "2":return <img src={gift3}/>; break;
          default:return null;
        }
    }
    )()}
</div>

3.使用:修改pageState數(shù)值,點(diǎn)擊保存即可

13.獲取Url拼接的參數(shù)

// 獲得URL參數(shù)
const query_params = new 
//問號之前的內(nèi)容
URLSearchParams(this.props.location.search);
console.log("參數(shù)"+query_params);
let state = query_params .get('pageState');
console.log("pageState:"+state);
this.setState({
  pageState: state,
});

14.URL跳轉(zhuǎn)

封裝跳轉(zhuǎn)方法

export function urlJump(params) {
  window.location.href = window.location.protocol + '//' + window.location.host  + params
}

使用

invite = (id) => {
    urlJump("/fission/invite/" + id)
  }

15.方法名傳參數(shù)(bind)

類的方法默認(rèn)是不會綁定 this 的。如果你忘記綁定 this.handleClick 并把它傳入 onClick, 當(dāng)你調(diào)用這個函數(shù)的時候 this 的值會是 undefined
//e.preventDefault()取消事件的默認(rèn)動作

例如,如果 type 屬性是 "submit",在事件傳播的任意階段可以調(diào)用任意的事件句柄,通過調(diào)用該方法,可以阻止提交表單。

class Popper extends React.Component{
    constructor(){
        super();
        this.state = {name:'Hello world!'};
    }
    
    preventPop(name, e){    //事件對象e要放在最后
        e.preventDefault();
        alert(name);
    }
    
    render(){
        return (
            <div>
                <p>hello</p>
                {/* 通過 bind() 方法傳遞參數(shù)。 */}
                <a  onClick={this.preventPop.bind(this,this.state.name)}>Click</a>
            </div>
        );
    }
}

16.KeyFrame動畫案例-(標(biāo)簽抖動效果)

代碼

<div className="getFreeBtn">
    <div class="btn" onClick={this.handleDownload.bind(this,'1','getFree','getFree_downloadBtn')}></div>
</div>

less樣式

.getFreeBtn {
  background:url('../../images/diary/diary_unlock_getFreeBtnBg.png') no-repeat;background-size:100%;
  width: 21.44rem;
  height: 8.1rem;
  line-height:0; 
  display: flex;
  position: relative;
  .btn{
    position: absolute;
    bottom: -1rem;
    left: 0;
    right: 0;
    width: 21.44rem; height: 2.88rem; display: block; background: url('../../images/diary/diary_unlock_getFreeBtn.png') no-repeat;background-size:100% ;
    animation: bounce 1.2s cubic-bezier(0.67, 0.04, 0.32, 0.96) infinite forwards;
    }
}
@keyframes bounce {
  0% {
   transform: scale(1);
  }
  30% {
   transform: scale(0.8);
  }
  40% {
   transform: scale(1);
  }
  50% {
   transform: scale(0.9);
  }
  65% {
   transform: scale(1);
  }
  100% {
   transform: scale(1);
  }
 }

效果圖

KeyFrame動畫案例.gif

17.React設(shè)置文字溢出,多余顯示省略號

單行文本

<style>
  .text {
        display: inline-block;
        white-space: nowrap; //強(qiáng)制不換行
        overflow: hidden;//超出隱藏
        text-overflow:ellipsis;// [??l?ps?s] 顯示“……”
  }
</style>

多行文本

<div className="orderDesc">               
<p style={{"WebkitBoxOrient": "vertical"}}>{"多行文本溢出,多行文本溢出,多行文本溢出,多行文本溢出"}</p>
</div>

//CSS
.orderDesc {
    margin-left: 1.3rem;
    margin-right: 0.56rem;
    margin-top: 0.38rem;
    margin-bottom: 0;
    width: 11.75rem;
    height: 3.75rem;
    // background: yellow;
    p{
        
        font-size: 0.88rem;
        line-height: 1.25rem;
        text-align: left;
        color: #515151;
        display: -webkit-box;
        -webkit-box-orient: vertical;//react項(xiàng)目中發(fā)現(xiàn)并不能實(shí)現(xiàn) style={{"WebkitBoxOrient": "vertical"}}
        -webkit-line-clamp: 3;
        overflow: hidden;
    }
}

文本溢出第三種處理:flex

.v-item {
  display: flex;
  justify-content: space-between;
  p {
    margin-left: 0.5rem;
    width: 70%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow:ellipsis;
  }   
  .time{
    display: flex;
    justify-content: flex-end;
    margin-right: 0.5rem;
    width: 20%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow:ellipsis;
    // background: yellow;
  }
}

18.監(jiān)聽滾動事件改變標(biāo)簽的樣式

componentDidMount() {
    //1.添加滑動監(jiān)聽
    window.addEventListener('scroll', this.handleScroll);
}
  /**
   * 滾動事務(wù)
   * @private
   */
  handleScroll=(event)=>{
    //滾動條高度
    let ctx=this;
    //可視區(qū)域高度
    let clientHeight = document.documentElement.clientHeight; 
    //滾動條滾動高度
    let scrollTop  = document.documentElement.scrollTop;  
    //滾動內(nèi)容高度
    let scrollHeight =document.documentElement.scrollHeight; 
    // 距離頁面底部的高度
    const height = scrollHeight - scrollTop - clientHeight;
    console.log("clientHeight:"+clientHeight+"scrollTop:"+scrollTop+"scrollHeight"+scrollHeight+"height:"+height);
    
    if (scrollTop<100) {
      this.setState({
        isScroll: false
      })
    }else {
      this.setState({
        isScroll: true
      })
    }
}

使用

{/* 定義props isScroll 根據(jù)偏移量 設(shè)置不同的ClassName */}
<div className= {isScroll ? "fixed-joinGroup" : "group-joinGroup"} onClick={this.handleJoinGroupNow}>
    <div className="title">
        {"一鍵參團(tuán)"}
    </div>
</div>
{/* CSS樣式設(shè)置 */}
 .group-joinGroup {
     width: 100%; display: flex; justify-content: center;
      .title {
        padding-top: 0.69rem;
        padding-bottom: 0.69rem;
        width: 20rem;
        background-color: #FF1634;
        border-radius:1.38rem; line-height: 100%;
          font-size: 1rem;
          color: #ffffff;
          margin-bottom: 10px;
      }
    }
.fixed-joinGroup {
  .title {
    padding-top: 0.69rem;
    padding-bottom: 0.69rem;
    position: fixed;
    left: 0px;
    right: 0px;
    margin-left:auto;
    margin-right:auto;
    bottom: 1rem;
    width: 20rem;
    background-color: #FF1634;
    border-radius:1.38rem; line-height: 100%;
      font-size: 1rem;
      color: #ffffff;
  }
}

效果圖:

React JS 監(jiān)聽滑動事件

19.Flex 布局相關(guān)

display: flex;//想使用Flex布局,必須使用這個屬性
justify-content: flex-end; 

1.設(shè)置單個子元素靠右

父元素設(shè)置了 flex 布局
display: flex;
align-items: center;
如何讓某個子元素靠右呢

方法一

flex: 1;
text-align: right;

方法二

margin-left: auto;

2.設(shè)置絕對居中

<div id="newInstall-body">
   <div className="title-views"></div>
</div>
//CSS
#newInstall-body{
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    .title-views {
        display: flex;
        margin-top: 1.13rem;
        margin-left: 0.63rem;
        margin-right: 0.63rem;
        margin-bottom: 0;
        //寬度不設(shè)置,默認(rèn)繼承父元素
        height: 4.25rem;
        background-color: red;
    }
}

3.設(shè)置圖片100%顯示

#newGuide-body{
    background: url(../../images/promotion/promotion_newInstall_bg.png) no-repeat;
    background-size:100% 100%;  
    width: 100%;
    height: 100%;
    }

4.設(shè)置標(biāo)簽內(nèi)內(nèi)容居右顯示

 .action-btn {
    display: flex;
    justify-content: flex-end;
    margin-right: 0.63rem;
    .un-shipped {
        width:5.63rem;
        height: 1.63rem;
    }    
    .shipped {
        width:5.63rem;
        background:rgba(255,220,53,1);
    }
 }

20.react中獲取input輸入框內(nèi)容的兩種方法

1.通過event對象信息的方式

<input onChange={(e)=>this.inputChange(e)}/>
<button onClick={()=>this.getInputValue} >獲取input的值</button>

inputChange(e){
    alert(e.target.value)
    this.setState({
        username:e.target.value
    })
}
getInputValue(){
    alert(this.state.username)
}

2.使用ref的方式

<div className="receiver-name">
        <input ref="name" onChange={()=>this.inputChange()} className="form-control" id="receiverName" name="receiverName" placeholder="請輸入收貨姓名" />
</div> 

<div className="receiver-phone">
        <input ref="phone" onChange={()=>this.inputChange()} className="form-control" id="receiverPhone" name="receiverPhone" placeholder="請輸入收貨電話" />
</div>  
<button onClick={()=>this.getInputValue()} >獲取input的值</button>
//數(shù)據(jù)賦值
inputChange(){
    //獲取dom節(jié)點(diǎn)元素
    //1.添加ref屬性
    //2.使用this.refs.receiverName獲取dom節(jié)點(diǎn)
    let name = this.refs.name.value;
    let phone = this.refs.phone.value;
    let address = this.refs.address.value;
    console.log(name,phone,address);
    this.setState({
        receiverName:name,
        receiverPhone:phone,
        receiverAddress: address,
    })
}

handleSubmit(){
   let message = "姓名:"+this.state.receiverName+"\n"+"手機(jī)號:"+this.state.receiverPhone+"\n"+"地址:"+this.state.receiverAddress
   console.log("message:"+message);
    this.onOk();
}

21.復(fù)制操作

1.表單簡單復(fù)制操作-(只支持瀏覽器)

<p>點(diǎn)擊復(fù)制后在右邊textarea CTRL+V看一下</p>
<input type="text" id="inputText" value="測試文本"/>
<input type="button" id="btn" value="復(fù)制"/>
<textarea rows="4"></textarea>
<script type="text/javascript">
    var btn = document.getElementById('btn');
    btn.addEventListener('click', function(){
        var inputText = document.getElementById('inputText');
        var currentFocus = document.activeElement;
        inputText.focus();
        inputText.setSelectionRange(0, inputText.value.length);
        document.execCommand('copy', true);
        currentFocus.focus();
    });
</script>

2.通用復(fù)制操作-copy-to-clipboard

安裝插件

npm install --save copy-to-clipboard

使用幫助

#引入插件
import copy from 'copy-to-clipboard';

if(copy("http://baidu.com")){
       console.log("復(fù)制成功");
}else{
       console.log("復(fù)制失敗")
}

3.react-copy-to-clipboard

安裝插件

npm install --save react-copy-to-clipboard

使用幫助

#引入插件
#this.onCopy  復(fù)制之后執(zhí)行的方法
import CopyToClipboard from 'react-copy-to-clipboard';
<CopyToClipboard text="http://baidu.com"
       onCopy={this.onCopy}>
       <span>Copy to clipboard with span</span>
</CopyToClipboard>

22.React 多個Audio 實(shí)例控制只播放當(dāng)前的,暫停其他Audio實(shí)例

關(guān)鍵代碼

// 暫停函數(shù)
pauseAllAudio = () =>  {
  var audios = document.getElementsByTagName("audio");
  // 暫停函數(shù)
  function pauseAll() {
      var self = this;
      [].forEach.call(audios, function (i) {
          // 將audios中其他的audio全部暫停
          i !== self && i.pause();
      })
  }
  // 給play事件綁定暫停函數(shù)
  [].forEach.call(audios, function (i) {
      i.addEventListener("play", pauseAll.bind(i));
  })
}
//Audio實(shí)例播放方法
fourthAudioPlay = () => {
    baiduStatisticsBehaviour('日記分享落地頁', '點(diǎn)擊', 'h5_riji_zj4');
    //暫停其他實(shí)例
    this.pauseAllAudio();
    let fourthAudio = this.refs.fourth
    if (fourthAudio.paused) {
      fourthAudio.play();
    } else {
      fourthAudio.pause();
    }
  }

使用

<audio ref="first" src={data && data.diary_mission ? data.diary_mission.mp3 : '' } style={{display: 'none'}}>
  Your browser does not support the audio element.
</audio>
<audio ref="second" src={data && data.diary_mission ? data.diary_mission.mp3 : '' } style={{display: 'none'}}>
  Your browser does not support the audio element.
</audio>
<audio ref="third" src={data && data.diary_mission ? data.diary_mission.mp3 : '' } style={{display: 'none'}}>
  Your browser does not support the audio element.
</audio>
<img onClick={this.fourthAudioPlay}
src={ fourthPaused ? smallPlayImg: smallPauseImg}
alt=""/>

23.React-JS (拼團(tuán)添加人數(shù)邏輯)

拼團(tuán)添加人數(shù)邏輯:Server返回數(shù)據(jù)不滿足最大人數(shù)8時,剩余人數(shù)由自己創(chuàng)建假數(shù)據(jù)

關(guān)鍵代碼

var members = res.groupbuyCate.member;
let pageState = res.groupbuyCate.pageState;
    console.log("members:"+members);
    if (typeof members != 'undefined'){
    members.map((member) => {
      items.push(member);
    });
}
  
console.log("items:"+items.length);
if (items.length < 8){
    let count = 8 - items.length;
    console.log("count:"+count);
    for(var i = 0; i < count; i++){
      items.push({ id: i,path:addBg});
    }
}
console.log(items);
//遍歷輸出對象
items.map((item)=>{
    console.log("Final:"+item.id);
})
  
this.setState({
  persons: items,
  pageState: pageState,
})

24.解決新版微信中H5頁面底部白條問題

問題描述:

微信將后退的按鈕移至了底部橫欄,遮擋住了原先底部的操作按鈕。


問題描述1

分享微信好友進(jìn)入有底部導(dǎo)航欄,點(diǎn)擊鏈接進(jìn)入沒有導(dǎo)航欄


問題描述2

分析:

點(diǎn)擊鏈接進(jìn)入 -> 不需要授權(quán)
點(diǎn)擊微信分享App圖標(biāo)進(jìn)入 -> 需要授權(quán)

如果進(jìn)入H5首頁每次都要微信授權(quán)來獲取用戶信息,那這個白條將每次都會出現(xiàn),因?yàn)閛auth授權(quán)一定會有跳轉(zhuǎn)。第一次授權(quán)跳轉(zhuǎn)是無法避免的,那么只要避免用戶進(jìn)行二次授權(quán),也就避免了白條的再次出現(xiàn)。

結(jié)果:只要授權(quán)就會有底部導(dǎo)航:所以,解決問題的關(guān)鍵點(diǎn)在于如何避免微信二次授權(quán)。

解決思路

  • 第一次微信授權(quán),存儲必要參數(shù)到Cookie
  • 第二次先從Cookie中取參數(shù),取到了就不跳授權(quán)
  • 第二次取不到就跳微信授權(quán)

代碼:

componentWillMount = () => {
    let w = document.documentElement.clientWidth; 
    console.log("width"+w);
    this.setState({
        width:w
    })
    initParameter();

    let sign = getParameter('sign')
    if (!sign && this.state.client == 1) {
      let url = "微信授權(quán)Url"
      window.location.href = url;
    } else {
      this.setState({
        sign: true
      })
    }
    let openid = getQueryString('openid');
    if(openid.length >= 20) {
        Cookies.set('openid', openid);
    }
  }
  
//初始化基礎(chǔ)參數(shù)
export function initParameter() {
  let sign = getQueryString('sign');
  let sso_id = getQueryString('sso_id');
  let openId = getQueryString('openId');

  sign && Cookies.set('sign', sign);
  sso_id && Cookies.set('sso_id', sso_id);
  openId && Cookies.set('openid', openId);
}

//獲取基礎(chǔ)參數(shù)(從Cookie)
export function getParameter(param) {
  let val = Cookies.get(param) || getQueryString(param)
  if(!val && param !== 'sign') {
    alert(param + 'empty')
    return
  }
  return val
}

//獲取Url拼接參數(shù)
export function  getQueryString(name) {
    let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    let r = window.location.search.substr(1).match(reg);
    // let r = window.location.search.substr(1).replace('?', '&').match(reg);
    if (r !== null) return decodeURIComponent(r[2]);
    return 0;
}

親測可實(shí)現(xiàn)隱藏效果

效果圖:


隱藏效果圖

25.頁面大圖處理

原圖
#exchange-voucher-body {
    background: url(../../images/voucher/activity_voucher_bg.png) no-repeat #1EB8FF;
    background-size:100%;  
    width: 100%;
    height: 100%;
    }

顯示效果


最終效果圖

26.React 刷新當(dāng)前頁(倒計時結(jié)束)

countDowntimeEndCallBack(){
      //  Toast.show("時間到");
      let reload = Cookies.get(global.cookiePrefix + "reload"+getParameter('groupbuy_id'));
      if (reload != 1){
        window.location.reload();
        Cookies.set(global.cookiePrefix + "reload"+getParameter('groupbuy_id'),1);
      }
    }

27. js判斷對象是否為空的幾種方法

1.將json對象轉(zhuǎn)化為json字符串,再判斷該字符串是否為"{}"

var data = {};
var b = (JSON.stringify(data) == "{}");
alert(b);//true

2.jquery的isEmptyObject方法

此方法是jquery將2方法(for in)進(jìn)行封裝,使用時需要依賴jquery
var data = {};
var b = $.isEmptyObject(data);
alert(b);//true

3.使用ES6的Object.keys()方法

//返回值也是對象中屬性名組成的數(shù)組
var data = {};
var arr = Object.keys(data);
alert(arr.length == 0);//true

28.React JS setTimeout 不能使用this.屬性名,否則報錯-參數(shù)未定義

let isOpenGroup  = this.state.pageState == "1";
setTimeout(function () {
//this.state.pageState 在block 內(nèi)會報錯
  if(isOpenGroup){
    console.log("未開團(tuán)");
  }else {
    console.log("已開團(tuán)");
  }
},500);

29.document.documentElement.scrollTop在手機(jī)端無效的解決方法

問題:廣告不會隨著頁面滾動而浮動

分析:標(biāo)準(zhǔn)瀏覽器是只認(rèn)識documentElement.scrollTop的,但chrome雖然我感覺比firefox還標(biāo)準(zhǔn),但卻不認(rèn)識這個,在有文檔聲明時,chrome也只認(rèn)識document.body.scrollTop.

因?yàn)閐ocument.body.scrollTop與document.documentElement.scrollTop兩者有個特點(diǎn),就是同時只會有一個值生效。比如document.body.scrollTop能取到值的時候,document.documentElement.scrollTop就會始終為0;反之亦然。
所以,如果要得到網(wǎng)頁的真正的scrollTop值,可以這樣:

//滾動條滾動高度
let scrollTop  = document.documentElement.scrollTop+document.body.scrollTop;

30.React 改變this的指向

  • 通過bind來指明當(dāng)前方法中的this指向當(dāng)前組件
export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
  }

  run () {
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.run.bind(this)}>點(diǎn)我</button>
    </div>
  }
}
  • 構(gòu)造函數(shù)constructor中改變this指向
export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
    this.run = this.run.bind(this)
  }

  run () {
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.run}>點(diǎn)我</button>
    </div>
  }
}
  • 使用箭頭函數(shù)改變this指向
export default class Test extends React.Component {
  constructor () {
    super()
    this.value = 1
  }

  run = (e) => {
    console.log(e)
    console.log(this.value)
  }

  render () {
    return <div>
      <button onClick={this.run}>點(diǎn)我</button>
    </div>
  }
}

31.React兄弟組件間傳值,動態(tài)更新標(biāo)題

image.png

方法一

引進(jìn)Redux,通過StoreProvider獲取全局狀態(tài)

方法②

用state和props配合傳值,通過輸入框組件的onchange函數(shù)監(jiān)聽輸入框的值的變化,然后去更新當(dāng)前頁面的state,將state的值傳入到另一個組件中,實(shí)現(xiàn)兄弟間傳值

export default class Page extends Component {
  static displayName = 'Page';
 
  constructor(props) {
    super(props);
    console.log(props);
    this.state = {
      name:'111',
    };
    
  }
  onChange = (value) => {
    this.setState({name:value});
  };
  render() {
    const name1 = this.state.name
    return (
      <div className="page"><br/><br/>
        <TestimonialCard name={name1} />
         <Input
            hasClear
            defaultValue="clear by click"
            size="small"
            aria-label="input with config of hasClear" value={this.state.name} onChange={this.onChange} />
      </div>
    );
  }
}

組件TestimonialCard關(guān)于傳值的代碼

constructor(props) {
    super(props); 
      this.state = {name:props.name};
  }
  componentWillReceiveProps(props){
      this.state = {name:props.name};
 
  }

32.React Diff算法

計算出Virtual DOM中真正變化的部分,并只針對該部分進(jìn)行原生DOM操作,而非重新渲染整個頁面,需要明確的是,進(jìn)行比較的是兩個組件

  • 節(jié)點(diǎn)不同,React 直接拋棄舊的節(jié)點(diǎn)生成新的節(jié)點(diǎn)
  • 判斷是否自定義節(jié)點(diǎn)(不會刪除節(jié)點(diǎn),在原來的節(jié)點(diǎn)上進(jìn)行操作)-> 是->state不同 重新渲染, 更新Dom ,state未變化, 不更新Dom
  • 不是自定義節(jié)點(diǎn)-> 比較屬性 class/id
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,890評論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,694評論 1 32
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵勝奧閱讀 5,203評論 0 1
  • 序言 作為一個企業(yè),2015年市值可以達(dá)到2715億美元,位居全球電信第一名,敢說這樣的單位外強(qiáng)中干,我是不是瘋了...
    指間天涯閱讀 879評論 2 4
  • 昨晚因不可抗原因10:38開始揉腹。最后睡著了,沒有晃海。可見揉腹助眠之功。 早上五點(diǎn)至五點(diǎn)半揉腹。打嗝。以往氣幾...
    蘇梅LI閱讀 199評論 0 1

友情鏈接更多精彩內(nèi)容