anthonyshort / deku

Render interfaces using pure functions and virtual DOM
https://github.com/anthonyshort/deku/tree/master/docs
3.41k stars 130 forks source link

`path` is different between 1st and 2nd time #343

Closed azu closed 8 years ago

azu commented 8 years ago

deku: 2.0.0-rc7

Twice call render and change path from previous time.

I've created reproduce repository: https://github.com/azu/deku-onupdate-path-issue

DEMO: http://azu.github.io/deku-onupdate-path-issue/

import {dom, element} from 'deku'
import {EventEmitter} from 'events'
const {createRenderer} = dom;
const emitter = new EventEmitter;
let counter = 0;
// 2nd, 3rd .... call `render`
let log = event => {
    emitter.emit("update");
};
// Define a state-less component
let MyButton = {
    onUpdate({path}){
        console.log(`${counter} onUpdate : ${path}`);
    },
    render({path, children}){
        console.log(`${++counter} render : ${path}`); // `path` is different between 1st and 2nd time
        return <button onClick={log}>{children}</button>
    }
};
let MyWrapper = {
    render(){
        return <div>
            <MyButton>Hello World!</MyButton>
        </div>
    }
};
let render = createRenderer(document.body);
emitter.on("update", ()=> {
    render(<MyWrapper />);
});
// 1st time
emitter.emit("update");

console.log:

1 render : tkghhrt.0.0
2 render : tkghhrt.0 <= drop .0 ?
2 onUpdate : tkghhrt.0
3 render : tkghhrt.0
3 onUpdate : tkghhrt.0

Is this indeeded behavior?