Цитата:
|
Цитата:
import {makeAutoObservable} from 'mobx' class Test { data = { arr: [ {id: '0', name: 'Item 0'}, {id: '1', name: 'Item 1'}, {id: '2', name: 'Item 2'}, ] } constructor(props) { makeAutoObservable(this) } add(obj) { //this.data.arr.push(obj) this.data.arr = [...this.data.arr, obj] } } export default new Test() С этим работает и так. :victory: import React from "react" import { StyleSheet, Text, View, Button, FlatList } from 'react-native' import { observer} from 'mobx-react-lite' import { toJS, runInAction } from "mobx" import test from '../store/test' function Test() { const renderItem = ({ item }) => ( <Text>{item.name}</Text> ) return ( <View style={styles.container}> <View style={styles.tab}> <Button title='Add' onPress={add} /> </View> <FlatList data={test.data.arr} renderItem={renderItem} keyExtractor={item => item.id} /> </View> ) function add() { const l = test.data.arr.length test.add({ id: l.toString(), name: 'Item ' + l }) } } const styles = StyleSheet.create({ container: { flex: 1, color: '#000', backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, tab: { margin: 70 } }) export default observer(Test) |
Цитата:
по кнопке случается все 3 вида изменений - две замены стейта, значение в пропсе, наблюдаемое значение в сторе. Перерендер один - он, похоже, идет следующим микротаском, потому что если store.func() обернуть в микротаск, то уже будет 2 рендера. в общем, реакт с мобиксом не так уж плохи :) import { makeObservable, observable, action } from 'mobx' import React, { useState } from 'react' import { observer } from 'mobx-react-lite' class Store { constructor() { makeObservable(this) } @observable a = 1 @observable b = 2 @action func() { this.a += 1 this.b += 1 } } const store = new Store() const Comp: React.FC<{ a: number }> = observer(({ a }) => { const [c, setC] = useState(3) const [d, setD] = useState(4) console.log('*** render Comp ', a, store.b, c, d) const handler = () => { setC(c + 1) setD(d + 1) // Promise.resolve().then(() => store.func()) store.func() } return ( <div> <div>{`a = ${a}, store.b = ${store.b}, c = ${c}, d = ${d}`}</div> <button type="button" onClick={handler}> change </button> </div> ) }) export const App: React.FC = observer(() => { console.log('*** render App') return <Comp a={store.a} /> }) |
Цитата:
import { observer} from 'mobx-react' ещё поправки, для чистоты эксперимента: const MobxFlatList = observer(FlatList) это вынеси наружу из function Test() const renderItem = ... тоже вынеси функцию для keyExtractor тоже вынеси отдельно наружу |
Alexandroppolus, я все это "запишу себе в книжечка"... (с)
Мало ли когда пригодится. :) Больше устроил вариант с другим подходом собственно изменения массива. |
Часовой пояс GMT +3, время: 11:39. |