I
Size: a a a
I
a
a
a
Б
$
подходит - это функция внутренней подписки на атом / экшен. При этом, повторюсь, можно и свой нейминг использовать//oldНу а чтобы установить значение то вызываем с аргументом значения
const computedAtom = computed(()=> atom1.get() + atom2.get());
//new
const computedAtom = computed(()=> atom1() + atom2());
//oldА теперь сравним с новой версией реатома
atom1.set(newValue);
//new
atom1(newValue);
//reatomРазве вторая версия не проще? Меньше дополнительных знаков и проще набирать - для автокомплита достаточно набрать пару букв имени атома в то время как с реатомом нужно сначала набрать доллар с открывающей скобкой и только потом уже первые буквы имени атома.
const computedAtom = Atom($ => $(atom1) + $(atom2));
//mobx
const computedAtom = Atom(() => atom1() + atom2());
//reatom
const displayName = Atom($ =>
$(firstName).length < 10
? $(firstName)
: $(fullName)
//mobx
const displayName = Atom(() =>
firstName().length < 10
? firstName()
: fullName()
a
//oldНу а чтобы установить значение то вызываем с аргументом значения
const computedAtom = computed(()=> atom1.get() + atom2.get());
//new
const computedAtom = computed(()=> atom1() + atom2());
//oldА теперь сравним с новой версией реатома
atom1.set(newValue);
//new
atom1(newValue);
//reatomРазве вторая версия не проще? Меньше дополнительных знаков и проще набирать - для автокомплита достаточно набрать пару букв имени атома в то время как с реатомом нужно сначала набрать доллар с открывающей скобкой и только потом уже первые буквы имени атома.
const computedAtom = Atom($ => $(atom1) + $(atom2));
//mobx
const computedAtom = Atom(() => atom1() + atom2());
//reatom
const displayName = Atom($ =>
$(firstName).length < 10
? $(firstName)
: $(fullName)
//mobx
const displayName = Atom(() =>
firstName().length < 10
? firstName()
: fullName()
Б
Б
const AppState = {и если допустим компонент Todo получает через пропсы объект тодошки то обращаться к полям (которые являются атомами) вполне себе удобно через вызов как функцию
count: Atom(0)
}
const CounterComponent = observer(() => {
return (
<div>
<div>count: ${AppState.count()}</div>
</div>
)
})
const TodoComponent = observer((todo) => {А как шаблон такого компонента запишется с апи нового реатома?
return (
<div>
<div>title: {todo.title()}</div>
<div>description: {todo.desc()}</div>
<div>author: {todo.author().firstName()}</div>
<div>folder: {todo.folder().name()}</div>
<div>board: {todo.folder().board().name()}</div>
</div>
)
})
Б
const AppState = {и если допустим компонент Todo получает через пропсы объект тодошки то обращаться к полям (которые являются атомами) вполне себе удобно через вызов как функцию
count: Atom(0)
}
const CounterComponent = observer(() => {
return (
<div>
<div>count: ${AppState.count()}</div>
</div>
)
})
const TodoComponent = observer((todo) => {А как шаблон такого компонента запишется с апи нового реатома?
return (
<div>
<div>title: {todo.title()}</div>
<div>description: {todo.desc()}</div>
<div>author: {todo.author().firstName()}</div>
<div>folder: {todo.folder().name()}</div>
<div>board: {todo.folder().board().name()}</div>
</div>
)
})
const TodoComponent = observer(() => {
...
<div>board: {todo.folder().board().name()}</div>
...
});
const TodoComponent = observer($ => (todo) => {
...
<div>board: {$($($(todo.folder).board).name)}</div>
...
}));
IA
IA
a
const AppState = {и если допустим компонент Todo получает через пропсы объект тодошки то обращаться к полям (которые являются атомами) вполне себе удобно через вызов как функцию
count: Atom(0)
}
const CounterComponent = observer(() => {
return (
<div>
<div>count: ${AppState.count()}</div>
</div>
)
})
const TodoComponent = observer((todo) => {А как шаблон такого компонента запишется с апи нового реатома?
return (
<div>
<div>title: {todo.title()}</div>
<div>description: {todo.desc()}</div>
<div>author: {todo.author().firstName()}</div>
<div>folder: {todo.folder().name()}</div>
<div>board: {todo.folder().board().name()}</div>
</div>
)
})
a
a
Б
const AppState = {
boards: Atom([
{
name: Atom("board1),
folders: Atom([
{
name: Atom("folder1"),
tasks: Atom([
{
name: Atom("task 1"),
completed: Atom(false)
},
...
])
}
...
])
}
...
])
}
const App = observer(() => {
...
<div>
{AppState.boards().map(board => <Board board={board}/>)}
</div>
...
});
const Board = observer((board) => {
...
<div>{board.name()}</div>
...
<div>
{board.folders().map(folder => <Folder folder={folder}/>}
</div>
...
})
const Folder = observer((folder) => {
...
<div>{folder.name()}</div>
...
<div>
{folder.tasks().map(task => <Task task={task}/>}
</div>
...
})
const Task = observer((task) => {
...
<div>{task.name()}</div>
...
})
const Task = observer((task) => {
const toogleComplete = () => {
task.completed(!task.completed);
}
...
<div>completed: {task.completed()}</div>
<button onClick={toogleComplete}>toggle complete</button>
...
});
const Folder = observer(folder => {
const addTodo = () => {
const newTodo = {
name: Atom(""),
completed: Atom(false)
}
folder.tasks([...folder.tasks(), newTodo]
}
...
<button onClick={addTodo}>add todo</div>
...
})
<div>board: {task.folder().board().name()}</div>
a
const AppState = {
boards: Atom([
{
name: Atom("board1),
folders: Atom([
{
name: Atom("folder1"),
tasks: Atom([
{
name: Atom("task 1"),
completed: Atom(false)
},
...
])
}
...
])
}
...
])
}
const App = observer(() => {
...
<div>
{AppState.boards().map(board => <Board board={board}/>)}
</div>
...
});
const Board = observer((board) => {
...
<div>{board.name()}</div>
...
<div>
{board.folders().map(folder => <Folder folder={folder}/>}
</div>
...
})
const Folder = observer((folder) => {
...
<div>{folder.name()}</div>
...
<div>
{folder.tasks().map(task => <Task task={task}/>}
</div>
...
})
const Task = observer((task) => {
...
<div>{task.name()}</div>
...
})
const Task = observer((task) => {
const toogleComplete = () => {
task.completed(!task.completed);
}
...
<div>completed: {task.completed()}</div>
<button onClick={toogleComplete}>toggle complete</button>
...
});
const Folder = observer(folder => {
const addTodo = () => {
const newTodo = {
name: Atom(""),
completed: Atom(false)
}
folder.tasks([...folder.tasks(), newTodo]
}
...
<button onClick={addTodo}>add todo</div>
...
})
<div>board: {task.folder().board().name()}</div>
const {…data} = useAtom(() => Atom($ => $(props.board.name)), [props.board.name])
Б
const {…data} = useAtom(() => Atom($ => $(props.board.name)), [props.board.name])
const someObject = { field1: Atom(..), field2: Atom(..) };В случая компютед-атома SomeAtom мы сетапим некий пустой список подписчиков куда будем добавлять атомы при вызове через "$(someObject.field1)". Так почему же нельзя сделать также и с компонентом SomeComponent ? Будет некий HOC-враппер который в процессе рендера засетапит пустой массив атомов и вызовет коллбек самого компонента а после его окончания подпишется на эти атомы и вызовет перерендер компонента после срабатывания обновления атомов
const SomeAtom = Atom($ => {
return $(someObject.field1) + $(someObject.field2)
});
const SomeComponent = observer($ => () => {
...
<div>{someObject.field1()}</div>
...
<div>{someObject.field2()}</div>
}));
a
const someObject = { field1: Atom(..), field2: Atom(..) };В случая компютед-атома SomeAtom мы сетапим некий пустой список подписчиков куда будем добавлять атомы при вызове через "$(someObject.field1)". Так почему же нельзя сделать также и с компонентом SomeComponent ? Будет некий HOC-враппер который в процессе рендера засетапит пустой массив атомов и вызовет коллбек самого компонента а после его окончания подпишется на эти атомы и вызовет перерендер компонента после срабатывания обновления атомов
const SomeAtom = Atom($ => {
return $(someObject.field1) + $(someObject.field2)
});
const SomeComponent = observer($ => () => {
...
<div>{someObject.field1()}</div>
...
<div>{someObject.field2()}</div>
}));
Б
const {…data} = useAtom(() => Atom($ => $(props.board.name)), [props.board.name])
Б