Starting from pole, Vinales did it the hard way as he slipped outside of the top 10 on the opening lap at the Circuit of The Americas.
He then charged his way back through the field to win by 1.7s ahead of Pedro Acosta and Enea Bastianini.
Acosta claimed the lead at Turn 2 on the opening lap as the pack swamped Vinales at the top of the hill after Jorge Martin triggered a chain reaction that dumped the Aprilia rider down the order.
Martin forced Bagnaia to sit up, making contact with the slow-starting Vinales in the process, leaving the instigator second behind Acosta.
He attacked for the lead midway around Lap 2, only to run wide and hand the place back.
Jack Miller and Marc Marquez came to blows at the same corner when the Gresini rider looked to steal fourth place, damaging the Spaniard’s bike in the process.
While he couldn’t get the job done there, he made the move stick at the final corner soon after, passing Bagnaia for third at Turn 8 on Lap 4.
Ahead, Martin and Acosta were battling for the lead, the former continuing to attack until he made it through on Lap 4.
Marquez soon climbed to second and, on Lap 5, attempted to seize the lead only to make contact with Martin’s rear wheel and fall to fourth, Acosta and Bagnaia scooting through.
The lead did change hands on Lap 10 when Acosta muscled his way through at Turn 11, Marquez taking the opportunity to follow him through at the next corner.
The six-time premier class champion then moved into the race lead at Turn 1, the first time he’d headed a race for Ducati.
However, his time out front was short as he dropped the Ducati under braking just half a lap later.
Acosta resumed top spot, while Vinales sat third after returning from his dramas on the opening lap.
On Lap 13, Vinales claimed the lead, Acosta finally wilting after seeing off several earlier attempts.
Once out front, the Aprilia rider held the advantage to the chequered flag over Acosta and Bastianini, who pinched the spot from Martin on the penultimate lap.
Miller faded to 13th atop the KTM, four places and 10 seconds behind his Red Bull KTM team-mate Brad Binder.
Martin continues to lead the MotoGP championship after the opening three rounds of the year, the Spaniard holding a 21-point advantage over Bastianini with Vinales in third.