首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用update方法和mithril组件封装状态

如何使用update方法和mithril组件封装状态
EN

Stack Overflow用户
提问于 2019-10-07 03:02:24
回答 1查看 188关注 0票数 0

我想渲染每个请求动画帧更新的状态。

我想用update方法和相应的组件封装state:

但这失败了,因为这不是mithril组件的正确用法。

代码语言:javascript
复制
import * as Vnode from 'mithril/render/vnode';
import * as h from 'mithril/hyperscript';

export default function Play() {
    // background is another encapsulation like Play
  let background = new Background(this);

  let data;

  this.init = d => {
    data = d;
    background.init();
  };

  this.update = delta => {
    background.update(delta);
  };

  this.component = ({
    view() {
    return h('div.' + data,
             [Vnode(background.component)]
              );
    });

}

呈现代码:

代码语言:javascript
复制
import mrender from 'mithril/render';
import * as Vnode from 'mithril/render/vnode';


export default function MRender(mountPoint) {

  this.render = (component) => {
    mrender(mountPoint, Vnode(component));
  };

}

用法:

代码语言:javascript
复制
let mrender = new MRender(element);

let play = new Play();

function step() {
  play.update();
  mrender.render(Vnode(play.component));
  requestAnimationFrame(step);
};

step();

我希望状态变化和渲染代码在同一位置,因为状态与视图动画有关。

EN

回答 1

Stack Overflow用户

发布于 2019-10-19 03:17:01

如果我理解正确的话,您希望能够在requestAnimationFrame更新组件时管理组件的内部状态吗?下面的内容可能会让你走上正轨:

代码语言:javascript
复制
const m = require('mithril');

//Use a closure to manage internal state of component
const play = initialVnode => {

  const { 
    timestamp
  } = initialVnode.attrs;

  const start = timestamp;

  return {

    view: vnode => m('ul',[
        m('li',`Start: ${start}`),
        m('li',`Current timestamp: ${vnode.attrs.timestamp}`),      
    ])
  }
};

let reqID;

const step = timestamp => {

  if( timestamp ){ //Start animating when timestamp is defined 

      m.render(document.body, m(play,{
        timestamp,
      }));
  }

  reqID = requestAnimationFrame(step);

  if( reqID === 60 ){ //Add condition to stop animating
     cancelAnimationFrame(reqID);
  }

};

step();

我希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58260390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档