From 5c0a616fd0e31bdd647ba80d7ecb4c6bf54c46c7 Mon Sep 17 00:00:00 2001 From: chriswayg Date: Mon, 14 Jun 2021 23:11:00 +0800 Subject: [PATCH 1/3] added Mobx superheroStore --- src/store/superheroes.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/store/superheroes.js diff --git a/src/store/superheroes.js b/src/store/superheroes.js new file mode 100644 index 0000000..1444702 --- /dev/null +++ b/src/store/superheroes.js @@ -0,0 +1,27 @@ +import {action, computed, makeObservable, observable} from 'mobx'; + +class Superheroes { + superheroes = []; + + constructor() { + makeObservable(this, { + superheroes: observable, + addHero: action, + deleteHero: action, + count: computed, + }); + } + addHero(hero) { + console.log('* ADD HERO: ' + JSON.stringify({...hero, id: Math.random()})); + this.superheroes = [...this.superheroes, {...hero, id: Math.random()}]; + } + + deleteHero(id) { + this.superheroes = this.superheroes.filter((hero) => hero.id !== id); + } + get count() { + return this.superheroes.length; + } +} + +export const superheroStore = new Superheroes(); From 473a182f1f87a7f04baab6a09dc6040e56164721 Mon Sep 17 00:00:00 2001 From: chriswayg Date: Mon, 14 Jun 2021 23:11:40 +0800 Subject: [PATCH 2/3] added Mobx Observer and Flatlist --- src/view/home.js | 93 ++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 39 deletions(-) mode change 100644 => 100755 src/view/home.js diff --git a/src/view/home.js b/src/view/home.js old mode 100644 new mode 100755 index 4b1921c..afa560b --- a/src/view/home.js +++ b/src/view/home.js @@ -1,44 +1,59 @@ -import React, { useState } from 'react'; +import React, {useState} from 'react'; +import {FlatList} from 'react-native'; +import {Observer} from 'mobx-react'; -import { Title } from '../style/text'; -import { Container, RowContainer } from '../style/container'; -import { CheetahInput } from '../style/input'; -import { CheeatahButton } from '../style/button'; +import {superheroStore} from '../store/superheroes'; +import {CheeatahListText} from '../style/text'; +import {ListSeparator} from '../style/separator'; +import {Title} from '../style/text'; +import {Container, RowContainer} from '../style/container'; +import {CheetahInput} from '../style/input'; +import {CheeatahButton} from '../style/button'; -export default Home = ({ navigation }) => { +export default Home = ({navigation}) => { + const [name, setName] = useState(''); + const [power, setPower] = useState(''); - const [superheroList, setHeroList] = useState([]); - const [name, setName] = useState(''); - const [power, setPower] = useState(''); + console.log('* reloading screen...'); - addHero = () => { - setHeroList(list => [...list, { name, power, id: Math.random() }]) - } + addHero = () => { + setHeroList((list) => [...list, {name, power, id: Math.random()}]); + }; - return ( - - Superheroes - setName(text)} - /> - setPower(text)} - /> - - addHero(text)} - marginRight={12} - /> - navigation.navigate('List', { - list: superheroList, - })} - /> - - - ); -} + return ( + + Superheroes + setName(text)} /> + setPower(text)} /> + + superheroStore.addHero({name, power})} + marginRight={12} + /> + navigation.navigate('List')} + /> + + + + {() => ( + item.id} + style={{width: '100%', marginTop: 20, paddingBottom: 10}} + ItemSeparatorComponent={() => } + renderItem={({item}) => ( + superheroStore.deleteHero(item.id)} + description={`Power: ${item.power}`} + /> + )} + /> + )} + + + ); +}; From 1b6e62604c4794d11b0ec0702b9ab07404aebbcf Mon Sep 17 00:00:00 2001 From: chriswayg Date: Mon, 14 Jun 2021 23:12:09 +0800 Subject: [PATCH 3/3] added Mobx observer --- src/view/ListScreen.js | 62 ++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 36 deletions(-) mode change 100644 => 100755 src/view/ListScreen.js diff --git a/src/view/ListScreen.js b/src/view/ListScreen.js old mode 100644 new mode 100755 index b4a27ad..ea54bbf --- a/src/view/ListScreen.js +++ b/src/view/ListScreen.js @@ -1,38 +1,28 @@ -import React, { useEffect, useState } from 'react'; +import React from 'react'; +import {observer} from 'mobx-react'; -import { CheeatahListText } from '../style/text'; -import { Container } from '../style/container'; -import { FlatList } from 'react-native'; -import { ListSeparator } from '../style/separator'; +import {CheeatahListText} from '../style/text'; +import {Container} from '../style/container'; +import {FlatList} from 'react-native'; +import {ListSeparator} from '../style/separator'; +import {superheroStore} from '../store/superheroes'; -export default ListScreen = ({ route }) => { - const [superheroList, setHeroList] = useState([]); - - useEffect(() => { - setHeroList(route.params.list) - }, []) - - - deleteHero = (id) => { - let filteredHeroes = superheroList.filter(hero => hero.id !== id) - setHeroList(filteredHeroes) - } - - return ( - - item.id} - style={{ width: '100%', marginTop: 20, paddingBottom: 10 }} - ItemSeparatorComponent={() => } - renderItem={({ item }) => ( - deleteHero(item.id)} - description={`Power: ${item.power}`} - /> - )} - /> - - ); -} +export default ListScreen = observer(() => { + return ( + + item.id} + style={{width: '100%', marginTop: 20, paddingBottom: 10}} + ItemSeparatorComponent={() => } + renderItem={({item}) => ( + superheroStore.deleteHero(item.id)} + description={`Power: ${item.power}`} + /> + )} + /> + + ); +});