Two ways to push live ticks in — pick one to walk through it:
data prop; the wrapper diffs it and appends, updates, or rolls the window for you.appendData / updateData / keepLast on the chart instance directly.Default to declarative; reach for imperative when ticks outrun your render loop or the data lives outside the component tree.
data prop. On every change the wrapper diffs the new array against the previous one and picks the cheapest mutation — append, update-in-place, roll, or bulk-replace. The chart on the left runs exactly this.const [data, setData] = useState(seed); useEffect(() => { const id = setInterval(() => { setData((prev) => [...prev, nextBar(prev)].slice(-120)); }, 1000); return () => clearInterval(id);}, []); return <CandlestickSeries id="price" data={data} />;smoothMs. A feed updates the forming bar each tick, then appends when it closes.setData((prev) => { const last = prev[prev.length - 1]; // same timestamp → update in place (eases via smoothMs) if (sameBar) return [...prev.slice(0, -1), { ...last, high, low, close }]; // new timestamp → append (entrance animation) return [...prev, { time: last.time + interval, open: last.close, high, low, close }];});.slice(-n). Unlike a full setSeriesData, trimming eases the Y axis instead of snapping, so the window rolls without jitter. Auto-scroll keeps the newest bar pinned to the right until the reader pans away. The same data prop drives Vue and Svelte.