Kyle Connor and Josh Morrissey each had a pair of assists for the Jets.
Connor Hellebuyck made 20 saves for Winnipeg, to move to 22-13-1.
Jets forward Sam Gagner played in his 1000th NHL career game.
Andrei Kuzmenko had a goal and an assist to pace the Canucks.
Conor Garland also scored for Vancouver, who saw their three-game winning streak snapped.
Collin Delia turned aside 35 shots for the Canucks, who dropped to 16-16-3.
Andrei Kuzmenko scored 41 seconds into the contest, one timing an Elias Pettersson feed from behind the goal line past Hellebuyck to give Vancouver a 1-0 lead.
Jets defenceman Dylan Samberg threw the puck across the ice from the right corner and Pettersson cut it off and slid the disc to Kuzmenko, who drilled it past Hellebuyck.
The Jets didn't record their first shot on goal until 10:39 into the first, when Mark Scheifele slapped a puck out of the air at Delia.
The momentum started to shift in the second period as Winnipeg outshot Vancouver 20-7 and took the lead with a pair of power play goals.
Mark Scheifele got Winnipeg on the board with a power play marker 13:52 into the second.
With Lane Pedersen off for tripping Dylan DeMelo, Scheifele got his stick on a Josh Morrissey shot from the left point and tipped it past Delia to tie the game at 1.
The goal was his 21st of the season.
Pierre-Luc Dubois gave the Jets the lead on a penalty shot 15:42 into the second after he was fouled from behind on a breakaway by Canucks defenceman Ethan Bear.
Dubois moved in before switching to his forehand, beating Delia blocker side with a wrister to make it 2-1.
The goal was his 17th of the season.
“Yeah, we had a slower start. Obviously, going down 1-0 isn’t how you want to start at home but I thought as the game was on, we got better and better. It wasn’t perfect, but you’re not going to go from how we were playing before to perfect. It’s like baby steps. Look, it’s two points, we’ll take it and we’re moving on to Edmonton," said Dubois.
Scheifele netted his second power play goal of the game with 2.5 seconds left in the second after firing through a screen provided by Adam Lowry.
The goal was his 22nd of the season.
Conor Garland pulled the Canucks to within a goal 13:11 into the third when he banked a puck off of Hellebuyck's left pad after an errant shot banked off the end glass.
The goal was his 6th of the season.
Scheifele added an empty netter with 28 seconds remaining in regulation to seal the win for the Jets.
“Yeah, for sure. That’s how you score in this league, you’ve got to do the right things over and over and not try to chase the game," said Scheifele of his three-goal night.
"I think we had four lines that were playing well today and we need that more and more every game,” he added.
Bo Horvat was succinct in his assessment of what went wrong on their end.
"We were happy with the way we started. We just didn't follow it up with anything good in the second and third," he said. "You know we kind of sat back a little bit and got comfortable and that's the result, that happens. You take a couple of you know, unfortunate penalties and they capitalize on them."
Canucks Head Coach Bruce Boudreau said his club lost their spark offensively during the second period.
“We started to focus a little too much on defence and not on offence at all. The last five minutes (of the second period), they started to gain some momentum and they’re a good shut-down team and they’ve got a good goalie," he said.
Jets Head Coach Rick Bowness said his club's turnaround in the second period was simple.
“We started skating again. I think that early goal against kind of set us on our heels a little bit. And that team has been playing really well lately so they were feeling it. Sometimes you just gotta play through it and we were able to do that tonight. That team, they had won what seven in a row on the road. So we had to play through it and we did.”
SHOTS-VANCOUVER 22 WINNIPEG 39
NOTES-Sam Gagner played in his 1000th career NHL game. The Jets honored him with a special pre-game ceremony to mark the occasion.
Winnipeg defenceman Josh Morrissey left the game after taking a hit from Vancouver's Tyler Myers and did not return. He will be re-evaluated Friday.