mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
e060130655
closes #76 closes #73
222 lines
4.7 KiB
JavaScript
222 lines
4.7 KiB
JavaScript
import { buildData, startMeasure, stopMeasure } from "../shared/utils.js";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Counter Widget
|
|
//------------------------------------------------------------------------------
|
|
class Counter extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
counter: 0
|
|
};
|
|
this.increment = this.increment.bind(this);
|
|
}
|
|
|
|
render() {
|
|
return React.createElement(
|
|
"div",
|
|
null,
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: this.increment
|
|
},
|
|
"Value: ",
|
|
this.state.counter
|
|
)
|
|
);
|
|
}
|
|
|
|
increment() {
|
|
this.setState({
|
|
counter: this.state.counter + 1
|
|
});
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
// Message Widget
|
|
//------------------------------------------------------------------------------
|
|
class Message extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.removeMessage = this.removeMessage.bind(this);
|
|
}
|
|
|
|
render() {
|
|
return React.createElement(
|
|
"div",
|
|
{
|
|
className: "message"
|
|
},
|
|
React.createElement(
|
|
"span",
|
|
{
|
|
className: "author"
|
|
},
|
|
this.props.message.author
|
|
),
|
|
React.createElement(
|
|
"span",
|
|
{
|
|
className: "msg"
|
|
},
|
|
this.props.message.msg
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
className: "remove",
|
|
onClick: this.removeMessage
|
|
},
|
|
"Remove"
|
|
),
|
|
React.createElement(Counter, null)
|
|
);
|
|
}
|
|
|
|
removeMessage() {
|
|
this.props.removeCB(this.props.message.id);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Root Widget
|
|
//------------------------------------------------------------------------------
|
|
class Main extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
messages: []
|
|
};
|
|
this.removeMessage = this.removeMessage.bind(this);
|
|
}
|
|
|
|
render() {
|
|
const msgList = this.state.messages.map(m =>
|
|
React.createElement(Message, {
|
|
key: m.id,
|
|
message: m,
|
|
removeCB: this.removeMessage
|
|
})
|
|
);
|
|
return React.createElement(
|
|
"div",
|
|
{
|
|
className: "main"
|
|
},
|
|
React.createElement(
|
|
"div",
|
|
{
|
|
className: "left-thing"
|
|
},
|
|
React.createElement(
|
|
"div",
|
|
null,
|
|
"Number of msg: ",
|
|
this.state.messages.length
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.addMessages(100)
|
|
},
|
|
"Add 100 messages"
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.addMessages(1000)
|
|
},
|
|
"Add 1000 messages"
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.addMessages(10000)
|
|
},
|
|
"Add 10000 messages"
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.addMessages(50000)
|
|
},
|
|
"Add 50000 messages"
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.updateSomeMessages()
|
|
},
|
|
"Update every 10th messags"
|
|
),
|
|
React.createElement(
|
|
"button",
|
|
{
|
|
onClick: _ => this.clear()
|
|
},
|
|
"Clear"
|
|
)
|
|
),
|
|
React.createElement(
|
|
"div",
|
|
{
|
|
className: "right-thing"
|
|
},
|
|
React.createElement(
|
|
"div",
|
|
{
|
|
className: "content"
|
|
},
|
|
msgList
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
addMessages(n) {
|
|
startMeasure("add " + n);
|
|
const newMessages = this.state.messages.concat(buildData(n));
|
|
this.setState({
|
|
messages: newMessages
|
|
});
|
|
stopMeasure();
|
|
}
|
|
|
|
clear() {
|
|
startMeasure("clear");
|
|
this.setState({
|
|
messages: []
|
|
});
|
|
stopMeasure();
|
|
}
|
|
|
|
updateSomeMessages() {
|
|
startMeasure("update every 10th");
|
|
const messages = this.state.messages;
|
|
for (let i = 0; i < messages.length; i += 10) {
|
|
messages[i].author += "!!!";
|
|
}
|
|
this.forceUpdate();
|
|
stopMeasure();
|
|
}
|
|
|
|
removeMessage(id) {
|
|
startMeasure("remove message");
|
|
const index = this.state.messages.findIndex(m => m.id === id);
|
|
const messages = this.state.messages.slice();
|
|
messages.splice(index, 1);
|
|
this.setState({
|
|
messages
|
|
});
|
|
stopMeasure();
|
|
}
|
|
} //-----------------------------
|
|
// INIT
|
|
//-----------------------------
|
|
|
|
ReactDOM.render(
|
|
React.createElement(Main, null),
|
|
document.getElementById("main")
|
|
);
|