This commit is contained in:
aaron 2023-09-12 00:16:37 +01:00
parent 5b61a9df10
commit 5a458eae71
7 changed files with 52 additions and 48 deletions

View file

@ -24,3 +24,24 @@ Some of the main focuses behind Vide's design choices:
- Independence from instance lifetimes. - Independence from instance lifetimes.
- A powerful reactive system that can surgically update properties as a result - A powerful reactive system that can surgically update properties as a result
of state changes. of state changes.
## Structure Of A Vide App
The entry point for all Vide apps is the `root()` function. This function
sets up Vide's reactivity system and allows proper disposal of your app. It
takes and calls a function that should create your entire app, then returns the
result.
In Vide, your app should be composed of functions, each function creates a
specific part of your app, and can be reused if needed. These functions are
called *components*.
```lua
local function App()
return create "ScreenGui" {
create "TextLabel" { Text = "hi" }
}
end
root(App).Parent = game.StarterGui
```

View file

@ -1,4 +1,4 @@
# Creating UI Elements # Creating UI
Instances are created using [`create()`](../../api/creation.md#create). Instances are created using [`create()`](../../api/creation.md#create).

View file

@ -5,7 +5,7 @@ Components are custom-made reusable pieces of UI made from other pieces of UI.
By using components you can make your application more modular and better By using components you can make your application more modular and better
organized. organized.
```lua ```lua [Button.lua]
local function Button(props: { local function Button(props: {
Position: UDim2, Position: UDim2,
Text: string, Text: string,
@ -20,6 +20,27 @@ local function Button(props: {
Activated = props.Activated Activated = props.Activated
} }
end end
return Button
```
```lua [App.lua]
local Button = require(Button)
local function App()
return create "ScreenGui" {
Button {
Position = UDim2.fromOffset(200, 200),
Text = "click me!",
Activated = function()
print "clickeD"
end
}
}
end
root(App).Parent = game.StarterGui
``` ```
Above is a simple example of a button component with its background color set to Above is a simple example of a button component with its background color set to

View file

@ -136,40 +136,6 @@ end
local update_queue = {} :: { Node<any> } local update_queue = {} :: { Node<any> }
-- -- runs node effects, recalculates descendants and runs descendant effects
-- local function rec<T>(node: StartNode<T>)
-- if not node.children then return end
-- local children = node.children :: {}
-- while children[1] do
-- table.insert(update_queue, children[1])
-- rec(children[1])
-- unparent(children[1])
-- end
-- table.clear(children)
-- end
-- local function update<T>(node: StartNode<T>)
-- --assert(#update_queue == 0, "update already in progress")
-- -- check if recursive update
-- local first = update_queue[1] == nil
-- rec(node)
-- if first then
-- for _, n in next, update_queue do
-- open_scope(n) -- todo
-- run_cleanups(n)
-- run_effect(n)
-- close_scope()
-- end
-- table.clear(update_queue)
-- end
-- end
local function update<T>(node: StartNode<T>) local function update<T>(node: StartNode<T>)
local children = node.children :: {} local children = node.children :: {}
if not children then return end if not children then return end

View file

@ -18,7 +18,7 @@ local function root<T>(fn: () -> T): (T, () -> ())
open_scope(node) open_scope(node)
local v = fn() local ok, v = pcall(fn)
close_scope() close_scope()

View file

@ -1,18 +1,8 @@
local BENCH, START = require("test/testkit").benchmark() local BENCH, START = require("test/testkit").benchmark()
-- try prevent inlining by wrapping in a closure referencing an upvalue that
-- cannot be determined at compile-time
local function NO_INLINE(fn)
local r = math.random()
return function(x)
local _ = r
fn(x)
end
end
local vide = require "src/init" local vide = require "src/init"
local N = 2^18 -- 262144[ local N = 2^18 -- 262144
BENCH("create state", function() BENCH("create state", function()
local source = vide.source local source = vide.source
@ -153,6 +143,8 @@ BENCH("update binding", function()
end) end)
end) end)
N /= 1024
BENCH("indexes() no change", function() BENCH("indexes() no change", function()
local data = {} local data = {}
@ -307,6 +299,8 @@ BENCH("values() all remove", function()
end) end)
end) end)
N *= 1024
BENCH("register new cleanup", function() BENCH("register new cleanup", function()
local cleanup = vide.cleanup local cleanup = vide.cleanup

View file

@ -8,6 +8,8 @@
- solution to nested reactivity, see: SolidJS stores - solution to nested reactivity, see: SolidJS stores
- SolidJS control flow components - SolidJS control flow components
- equality checking of derived sources - equality checking of derived sources
- investigate performance of wide graphs
- optimize child removal
- implement from solid: - implement from solid:
- Show - Show
- Switch - Switch