Daniel Sedin scored a goal and an assist for the Canucks, who ended a two-game skid, and Dale Weise scored what turned out to be the game-winning goal on a backhander at 11:15 of the second period.
It was then up to Cory Schneider, who preserved the victory with 33 saves despite allowing two St. Louis goals in the third period.
A timely boarding penalty on Vladimir Sobotka at 16:54 of the third meant the Blues played short handed down the stretch while needing a goal to tie the contest.
Jaden Schwartz and Patrik Berglund scored for St. Louis, and Jake Allen allowed three goals on 19 shots.
Police: Sword-wielding man demanded free tacos
N.J. man wakes up from 10-hour sleep with knife in back