无法将 HTML 转换为 React 特定代码。我正在使用“@pqina/flip”?
Having trouble converting HTML to React specific code. I am using `@pqina/flip`?
我正在使用 https://github.com/pqina/flip 并且想使用 React 实现 Tick.count.down()
方法。示例中没有给出特定于 React 的代码,而且作者也被淹没了,所以我想在这里请教一些 React 专家。
我已经克隆了上面的 repo 并用以下代码替换了 https://github.com/pqina/flip/tree/master/example/index.html 内容。
我有以下 HTML 完美运行:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Count Down</title>
<link rel="stylesheet" href="../dist/core/tick.core.min.css" />
</head>
<body>
<style>
.tick {
font-size: 2rem;
}
</style>
<p>Countdown from 10</p>
<div class="tick" data-did-init="startNumericCountdown">
<span data-view="text"></span>
</div>
<script>
function startNumericCountdown(tick) {
console.log(`start numeric countdown...`)
var counter = Tick.count.down(10, 'seconds')
counter.onupdate = function (value) {
tick.value = value
}
counter.onended = function () {
console.log(`countdown over `)
}
}
</script>
<script src="../dist/core/tick.core.kickstart.min.js"></script>
</body>
</html>
当我尝试将其转换为 React 时出现问题。目前,我有以下代码:
import React, { useRef, useEffect } from "react";
import Tick from "@pqina/flip";
import "@pqina/flip/dist/flip.min.css";
export const FlipDate = ({ value }) => {
const divRef = useRef();
const tickRef = useRef();
useEffect(() => {
const didInit = tick => {
console.log("didInit");
console.log({ tick });
tickRef.current = tick;
};
const currDiv = divRef.current;
const tickValue = tickRef.current;
Tick.DOM.create(currDiv, {
value: Tick.count.down(10, 'seconds'),
didInit
});
// divRef.current = Tick.count.down(10, 'seconds');
return () => Tick.DOM.destroy(tickValue);
});
useEffect(() => {
console.log({ tickRef });
if (tickRef.current) {
console.log({ divRef });
tickRef.current.value = value;
}
}, [value]);
return (
<div ref={divRef} className="tick">
<div data-repeat="true">
<span data-view="flip">Tick</span>
</div>
</div>
);
};
这没有按预期工作。我有基本的 flip
库,你可以在我的演示中看到:https://codesandbox.io/s/react-flip-countdown-timer-8tin3?file=/src/App.js
3 个文件是相同的代码:1 个使用 class 组件 Flip.js
,2 个使用 Hooks Flipr.js
& Flippen.js
.
我想让 FlipDate.js
工作。它应该从 10 秒倒计时到 0 秒。上周一直在尝试这个,但无法解决这个问题。感谢任何帮助
旁注:https://github.com/pqina/flip 使用 https://github.com/pqina/tick underhood.
我也在 /r/reactjs 上的 Reddit 上发布了同样的问题,并在那里找到了答案。这是一个可行的解决方案:
import React, { useRef, useEffect, useState } from "react";
import Tick from "@pqina/flip";
import "@pqina/flip/dist/flip.min.css";
export const WorkingFlipDate = ({ value }) => {
const divRef = useRef();
const tickRef = useRef();
const [tickValue, setTickValue] = useState(value);
// Make the Tick instance and store it in the refs
useEffect(() => {
const didInit = tick => {
tickRef.current = tick;
};
const currDiv = divRef.current;
const tickValue = tickRef.current;
Tick.DOM.create(currDiv, {
value,
didInit
});
return () => Tick.DOM.destroy(tickValue);
}, [value]);
// Start the Tick.down process
useEffect(() => {
const counter = Tick.count.down(value, {
format: ["d", "h", "m", "s"]
});
// When the counter updates, update React's state value
counter.onupdate = function(value) {
setTickValue(value);
};
// TODO: I don't know how to destroy this
return () => {
counter.onupdate = () => {};
};
}, [value]);
// When the tickValue is updated, update the Tick.DOM element
useEffect(() => {
if (tickRef.current) {
tickRef.current.value = tickValue;
}
}, [tickValue]);
return (
<div ref={divRef} className="tick">
<div data-repeat="true">
<span data-view="flip">Tick</span>
</div>
</div>
);
};
我正在使用 https://github.com/pqina/flip 并且想使用 React 实现 Tick.count.down()
方法。示例中没有给出特定于 React 的代码,而且作者也被淹没了,所以我想在这里请教一些 React 专家。
我已经克隆了上面的 repo 并用以下代码替换了 https://github.com/pqina/flip/tree/master/example/index.html 内容。
我有以下 HTML 完美运行:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Count Down</title>
<link rel="stylesheet" href="../dist/core/tick.core.min.css" />
</head>
<body>
<style>
.tick {
font-size: 2rem;
}
</style>
<p>Countdown from 10</p>
<div class="tick" data-did-init="startNumericCountdown">
<span data-view="text"></span>
</div>
<script>
function startNumericCountdown(tick) {
console.log(`start numeric countdown...`)
var counter = Tick.count.down(10, 'seconds')
counter.onupdate = function (value) {
tick.value = value
}
counter.onended = function () {
console.log(`countdown over `)
}
}
</script>
<script src="../dist/core/tick.core.kickstart.min.js"></script>
</body>
</html>
当我尝试将其转换为 React 时出现问题。目前,我有以下代码:
import React, { useRef, useEffect } from "react";
import Tick from "@pqina/flip";
import "@pqina/flip/dist/flip.min.css";
export const FlipDate = ({ value }) => {
const divRef = useRef();
const tickRef = useRef();
useEffect(() => {
const didInit = tick => {
console.log("didInit");
console.log({ tick });
tickRef.current = tick;
};
const currDiv = divRef.current;
const tickValue = tickRef.current;
Tick.DOM.create(currDiv, {
value: Tick.count.down(10, 'seconds'),
didInit
});
// divRef.current = Tick.count.down(10, 'seconds');
return () => Tick.DOM.destroy(tickValue);
});
useEffect(() => {
console.log({ tickRef });
if (tickRef.current) {
console.log({ divRef });
tickRef.current.value = value;
}
}, [value]);
return (
<div ref={divRef} className="tick">
<div data-repeat="true">
<span data-view="flip">Tick</span>
</div>
</div>
);
};
这没有按预期工作。我有基本的 flip
库,你可以在我的演示中看到:https://codesandbox.io/s/react-flip-countdown-timer-8tin3?file=/src/App.js
3 个文件是相同的代码:1 个使用 class 组件 Flip.js
,2 个使用 Hooks Flipr.js
& Flippen.js
.
我想让 FlipDate.js
工作。它应该从 10 秒倒计时到 0 秒。上周一直在尝试这个,但无法解决这个问题。感谢任何帮助
旁注:https://github.com/pqina/flip 使用 https://github.com/pqina/tick underhood.
我也在 /r/reactjs 上的 Reddit 上发布了同样的问题,并在那里找到了答案。这是一个可行的解决方案:
import React, { useRef, useEffect, useState } from "react";
import Tick from "@pqina/flip";
import "@pqina/flip/dist/flip.min.css";
export const WorkingFlipDate = ({ value }) => {
const divRef = useRef();
const tickRef = useRef();
const [tickValue, setTickValue] = useState(value);
// Make the Tick instance and store it in the refs
useEffect(() => {
const didInit = tick => {
tickRef.current = tick;
};
const currDiv = divRef.current;
const tickValue = tickRef.current;
Tick.DOM.create(currDiv, {
value,
didInit
});
return () => Tick.DOM.destroy(tickValue);
}, [value]);
// Start the Tick.down process
useEffect(() => {
const counter = Tick.count.down(value, {
format: ["d", "h", "m", "s"]
});
// When the counter updates, update React's state value
counter.onupdate = function(value) {
setTickValue(value);
};
// TODO: I don't know how to destroy this
return () => {
counter.onupdate = () => {};
};
}, [value]);
// When the tickValue is updated, update the Tick.DOM element
useEffect(() => {
if (tickRef.current) {
tickRef.current.value = tickValue;
}
}, [tickValue]);
return (
<div ref={divRef} className="tick">
<div data-repeat="true">
<span data-view="flip">Tick</span>
</div>
</div>
);
};