There are various ways in which one or multiple photons can be used to encode qubits.
Potentially the most widely used encoding is the polarization-encoded photon (at least when quantum communication is assumed to be included within the scope of 'quantum computing' for this question). Here, a single photon is used as a qubit, where two orthogonal polarization directions are used as the computational basis of the encoded qubit.
Another often used encoding within communication tasks is the 'time-bin' encoding. Here, the qubit can be regarded as a window in time during which a single photon can exist. The $|0\rangle$ state is then encoded as the photon being (roughly speaking) within the first half of the window, and the $|1\rangle$ state is encoded as the photon being in the latter half of the window. Oftentimes there are more stringent windows instead of a 'full half' for the states.
Turning more to proper 'quantum computers', photons can be used in various ways to encode qubits. Another widely used single photon encoding is the so-called 'rail'-encoding when talking about integrated photonics (i.e. 'photons on a chip'). Here, there are two waveguides engraved into a chip through which a photon can travel. The qubit's computational basis is encoded as the photon being in the one or the other waveguide.
It is, in principle, even possible to use both the polarization and the 'rail' encoding together at the same time, to encode two qubits into a single photon - this is area of active research. This is sometimes called 'dual-rail' encoding, compared to the 'normal' rail encoding described above, which is then known as 'single-rail' encoding.
There exist, however, also photonic quantum computers (at least on paper) that do not use a single photon to encode a qubit. As photons are bosons, they can be used to create bosonic codes like GKP-, cat- or binomial codes, although most research for implementations of these codes is being performed for harmonic oscillators in, for instance, superconductor devices.
If we focus on the actual computational steps, there are various ways of implementing gates.
Relatively agnostic of the encoding (as long as its single-photon) is the KLM protocol, which uses combinations of beam splitters and phase shift materials (which fall both within the scope of linear optics) to implement single-qubit gates. Two qubit gates (namely, a conditional sign flip) are also implemented by linear elements, but the big drawback of this method is that it is non-deterministic.
Focusing specifically on rail encodings, one can also have non-linear interactions between the two modes by bringing the two waveguides together in a birefringent (?) material. This method also allows to implement two-qubit gates, by bringing the $|1\rangle$ waveguides of both qubits together in a similar fashion. I am not at all an expert on this matter, however.