vue和react中props變化后修改state的方式

如果只想在 state 更改時重新計算某些數(shù)據(jù),比如搜索框案例。

在這里插入圖片描述

vue

<template>
  <div>
    <input type="text" v-model="filterText">
    <ul>
      <li v-for="item in filteredList" :key="item.id">
        {{ item.text }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    list: {
      type: Array,
      default: () => ([])
    }
  },
  data () {
    return {
      filterText: ''
    }
  },
  computed: {
    filteredList () {
      return this.list.filter(item => item.text.includes(this.filterText))
    }
  }
}
</script>

react

import React, { PureComponent } from 'react';

class Example extends PureComponent {
  state = {
    filterText: ''
  };
  handleChange = event => {
    this.setState({
      filterText: event.target.value
    })
  }
  render() {
    const filteredList = this.filter(this.props.list, this.state.filterText)
    return (
      <>
        <input
          type="text"
          onChange={this.handleChange}
          value={this.state.filterText} />
        <ul>
          {
            filteredList.map(
              item => <li key={item.id}>{item.text}</li>
            )
          }
        </ul>
      </>
    );
  }
}

如果你想在 prop 更改時“重置”某些 state互纯,比如隨機(jī)默認(rèn)值案例

在這里插入圖片描述

vue

Vue提供了一種更通用的方式來觀察和響應(yīng)Vue實例上的數(shù)據(jù)變動:偵聽屬性 watch红柱。

<template>
  <div>
    <input type="text" v-model="text">
  </div>
</template>

<script>
export default {
  props: {
    email: {
      type: String,
      default: ''
    }
  },
  data () {
    return {
      text: ''
    }
  },
  watch: {
    email: {
      immediate: true,
      handler (value) {
        this.text = value
      }
    }
  }
}
</script>

react

React生命周期 getDerivedStateFromProps 會在調(diào)用 render 方法之前調(diào)用,并且在初始掛載及后續(xù)更新時都會被調(diào)用宁仔。它應(yīng)返回一個對象來更新 state稠屠,如果返回 null 則不更新任何內(nèi)容。

父組件重新渲染時觸發(fā)翎苫,請注意权埠,不管原因是什么,都會在每次渲染前觸發(fā)此方法煎谍。

class Example extends Component {
  state = {
    text: ''
  };
  handleChange = (event) => {
    this.setState({
      text: event.target.value
    })
  }
  static getDerivedStateFromProps(nextProps, prevState) {
    if (prevState.email !== nextProps.email) {
      return {
        text: nextProps.email,
        email: nextProps.email
      }
    }
    return {text: prevState.text}
  }
  render() {
    return (
      <>
        <input
          type="text"
          onChange={this.handleChange}
          value={this.state.text} />
      </>
    );
  }
}

改進(jìn)

直接復(fù)制 propstate 是一個非常糟糕的想法攘蔽。這兩者的關(guān)鍵在于,任何數(shù)據(jù)呐粘,都要保證只有一個數(shù)據(jù)來源满俗,而且避免直接復(fù)制它。

vue

<template>
  <div>
    <input type="text" :value="value" @input="handleInput">
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      default: ''
    }
  },
  methods: {
    handleInput (e) {
      this.$emit('input', e.target.value)
    }
  }
}
</script>
<template>
  <div id="app">
    <Example v-model="email"/>
    <button @click="handleClick">默認(rèn)值</button>
  </div>
</template>

<script>
import Example from './components/Example.vue'

export default {
  components: {
    Example
  },
  data () {
    return {
      email: ''
    }
  },
  methods: {
    handleClick () {
      this.email = String(Math.random())
    }
  }
}
</script>

react

function Example (props) {
  return <input onChange={props.onChange} value={props.email} />;
}
class App extends React.Component {
  state = {
    email: ''
  }
  handleClick = () => {
    this.setState({
      email: String(Math.random())
    })
  }
  handleChange = (event) => {
    this.setState({
      email: event.target.value
    })
  }
  render() {
    return (
      <>
        <Example email={this.state.email} onChange={this.handleChange} />
        <div>
          <button onClick={this.handleClick}>默認(rèn)值</button>
        </div>
      </>
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末作岖,一起剝皮案震驚了整個濱河市唆垃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痘儡,老刑警劉巖辕万,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡渐尿,警方通過查閱死者的電腦和手機(jī)醉途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涡戳,“玉大人结蟋,你說我怎么就攤上這事∮嬲茫” “怎么了嵌屎?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恍涂。 經(jīng)常有香客問我宝惰,道長,這世上最難降的妖魔是什么再沧? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任尼夺,我火速辦了婚禮,結(jié)果婚禮上炒瘸,老公的妹妹穿的比我還像新娘淤堵。我一直安慰自己,他們只是感情好顷扩,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布拐邪。 她就那樣靜靜地躺著,像睡著了一般隘截。 火紅的嫁衣襯著肌膚如雪扎阶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天婶芭,我揣著相機(jī)與錄音东臀,去河邊找鬼。 笑死犀农,一個胖子當(dāng)著我的面吹牛惰赋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播井赌,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谤逼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仇穗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤戚绕,失蹤者是張志新(化名)和其女友劉穎纹坐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舞丛,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡耘子,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年果漾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷誓。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绒障,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捍歪,到底是詐尸還是另有隱情户辱,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布糙臼,位于F島的核電站庐镐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏变逃。R本人自食惡果不足惜必逆,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揽乱。 院中可真熱鬧名眉,春花似錦、人聲如沸凰棉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渊啰。三九已至探橱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绘证,已是汗流浹背隧膏。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嚷那,地道東北人胞枕。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像魏宽,于是被迫代替她去往敵國和親腐泻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容