jiawei chen
Front-end Engineer
A Javascript library for building user interfaces .
{
todosById: {
"44": {
name: "get milk from corner store",
done: false,
prerequisites: [{ $type: "ref", value: ["todosById", 54] }]
},
"54": {
name: "withdraw money from ATM",
done: false,
prerequisites: []
}
},
todos: [
{ $type: "ref", value: ["todosById", 44] },
{ $type: "ref", value: ["todosById", 54] }
]
}
get(["todos", 0, "prerequisites", 0, "name"])
export const dataModel = new falcor.Model({
source: new HttpDataSource(url),
})
export const uiModel = new falcor.Model({
cache: {
articleList: { page: 1 },
},
})
const greeting = [{
route: 'greeting.rules[{keys:ids}]',
get: async pathset => {
const query = { sceneId: pathset.ids[0] }
const rules = await weini.get('/manager/warm_up/index').
query(reverseCamelcase(query)).
json().
then(body => toCamelcase(body.result))
return {
path: pathset,
value: $atom(rules),
}
},
}]
// action/signin.js
export const loadProps = async (params, location) => {
const response = await uiModel.get(['signin', ['username', 'password']])
const { username, password } = response.json.signin
const query = queryString.parse(location.search)
const { redirect = '/' } = query
return { username, password, redirect: decodeURIComponent(redirect) }
}
export const handleChange = async (key, value) => {
await uiModel.setValue(['signin', key], value)
return global.reload('signin: handleChange', key, value)
}
// container/app/signin.jsx
const SigninContainer = props => <Signin {...props} />
SigninContainer.loadProps = loadProps
export default SigninContainer
Avoid empty props
Stateless component
Grained control
Decouple: html/css/js -> components
Semantic structure
Route structure
Repeated use
CSS in JS (bug, lose power)
ClassName hooks (class dirty, lose semantics)
Global component (<admin-signin>...</<admin-signin>)
Local component (<div data-username>)
const Username = ({ username }) => (
<div data-username>
<label>
<strong>用户名</strong>
<TextField name="username" defaultValue={username} required
autoFocus onChange={e => handleChange('username', e.target.value)} />
</label>
</div>
)
const Signin = props => {
const { username, password, redirect } = props
return (
<admin-signin>
<form onSubmit={...}>
<Username username={username} />
<Password password={password} />
<Submit />
</form>
</admin-signin>
)
}
export default Signin
By jiawei chen
React Introduce