Quinn Hughes and Elias Pettersson, into an empty net, also scored for Vancouver (16-8-1). The Canucks remain three points back of the Pacific Division-leading Vegas Golden Knights, who also won.
Chipping in a pair of assists was defenceman Filip Hronek, who continues his breakout season. With 25 points (two goals, 23 assists) in 24 games, he’s just 14 points off his career high set last season.
Elias Lindholm, with two goals, and Mikael Backlund scored for Calgary (10-11-3), which lost at home in regulation for the first time in six games. The Flames had been 4-0-1 in their previous five games at the Scotiabank Saddledome.
Thatcher Demko made 19 saves for the Canucks to improve to 12-6-0.
At the other end, Jacob Markstrom had 19 stops. His record falls to 6-8-2.
With the visitors up 2-1 after the first period, the scored remained that way into the final minute of the second when shortly after a power play ended, but with the Canucks still having the Flames hemmed in, Mikheyev chipped in a loose puck at the side of the Flames net for the eventual game-winner.
Lindholm got Calgary back to within one at 15:39 of the third on his sixth goal, scoring after a nice cross-ice pass by Yegor Sharangovich, but Zadorov restored the two-goal cushion when his long clearing attempt from deep in his own end bounced into the empty net.
With the goalie pulled again and on the power play, Lindholm scored his second with 54 seconds left but the Canucks would hold on to improve to a perfect 13-0-0 when leading after two periods.
Vancouver opened the scoring at 2:03 on its first shot of the game.
Taking a pass from Brock Boeser, Hughes strode off the sideboards and from the faceoff dot snapped a shot that beat Markstrom glove side.
Lafferty doubled the lead just over six minutes later when Hronek’s slapshot from the blue line hit Mikheyev in front and caromed to Lafferty, who knocked in his sixth goal.
Calgary got on the scoreboard at 12:18 of the first when it’s slumping power play, which entered the game 1-for-34 in the previous 12 games, came through on its first opportunity.
After a strong play by rookie Connor Zary to keep the puck in at the blue line while fending off pressure from Lafferty, he then got the puck to MacKenzie Weegar who set up Adam Ruzicka whose hard pass to the front of the net was steered in by Backlund.
Flames finished 2-for-5 on the man advantage while the Canucks were 0-for-4.
Nikita Zadorov, acquired from the Flames on Thursday in exchange for two draft picks, made his Canucks debut on a pairing with Tyler Myers. It wasn’t a warm welcome though as the defenceman, who had requested a trade, was lustily booed every time he touched the puck in the first period.
DI GIUSEPPE SITS
With Phil Di Giuseppe out of the lineup for the first time as a healthy scratch, Andrei Kuzmenko moved into his spot alongside Boeser and J.T. Miller. Lafferty was elevated from the fourth line to play with Mikheyev and Pettersson.
Canucks: Kickoff a five-game homestand against the New Jersey Devils on Tuesday.
Flames: Back in action on Tuesday when the Minnesota Wild visit the Saddledome.